home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / shells / tcsh602.zoo / tcsh602 / diffs < prev    next >
Text File  |  1993-02-22  |  77KB  |  2,962 lines

  1. diff --context --new-file --recursive ../tcsh-6.02/Makefile ./Makefile
  2. *** ../tcsh-6.02/Makefile    Wed May 20 04:00:52 1992
  3. --- ./Makefile    Sun Feb 21 01:39:52 1993
  4. ***************
  5. *** 7,12 ****
  6. --- 7,16 ----
  7.   # With an input editor, command completion, etc. and ported to all sorts of
  8.   # things; Paul Placeway, CIS Dept., Ohio State University
  9.   #
  10. + CROSSDIR = /usr/users1/mat91/mh1/atari/cross-gcc
  11. + CROSSBIN = $(CROSSDIR)/bin
  12.   SHELL=/bin/sh
  13.   VERSION=6.02
  14.   BUILD=tcsh
  15. ***************
  16. *** 43,55 ****
  17.   
  18.   # gcc 2.0
  19.   # On the sparc, don't use -O2; it breaks setjmp() and vfork()
  20. ! CFLAGS=-O $(INCLUDES)
  21.   
  22.   # gcc-2.1
  23. ! CFLAGS=-O2 $(INCLUDES)
  24.   
  25.   # gcc 2.0+ on linux
  26. ! #CFLAGS=-O6 $(INCLUDES) -finline-functions -fstrength-reduce
  27.   
  28.   #hpux 8.0
  29.   #CFLAGS= $(INCLUDES) +O3 -Aa
  30. --- 47,60 ----
  31.   
  32.   # gcc 2.0
  33.   # On the sparc, don't use -O2; it breaks setjmp() and vfork()
  34. ! #CFLAGS=-O $(INCLUDES)
  35.   
  36.   # gcc-2.1
  37. ! #CFLAGS=-O2 $(INCLUDES)
  38.   
  39.   # gcc 2.0+ on linux
  40. ! # MiNT
  41. ! CFLAGS=-O6 -mbaserel $(INCLUDES) -finline-functions -fstrength-reduce -DNO_CRYPT
  42.   
  43.   #hpux 8.0
  44.   #CFLAGS= $(INCLUDES) +O3 -Aa
  45. ***************
  46. *** 106,112 ****
  47.   ################################################################
  48.   ## LIBES.  Pick one, or roll your own.
  49.   ################################################################
  50. ! LIBES= -ltermcap        ## BSD style things, hpux
  51.   #LIBES= -ltermcap -lcs        ## Mach
  52.   #LIBES= -lcurses        ## Sys V3 w/o networking (and Sys V4)
  53.   #LIBES= -lcurses -lc /usr/ucblib/libucb.a ## Sys V4 with BSDTIMES
  54. --- 111,117 ----
  55.   ################################################################
  56.   ## LIBES.  Pick one, or roll your own.
  57.   ################################################################
  58. ! #LIBES= -ltermcap        ## BSD style things, hpux
  59.   #LIBES= -ltermcap -lcs        ## Mach
  60.   #LIBES= -lcurses        ## Sys V3 w/o networking (and Sys V4)
  61.   #LIBES= -lcurses -lc /usr/ucblib/libucb.a ## Sys V4 with BSDTIMES
  62. ***************
  63. *** 136,142 ****
  64.   #LIBES= -lcurses -lnsl -lsocket -lc /usr/ucblib/libucb.a ## Stardent Vistra
  65.   #LIBES= -ltermcap -lndir -lsocket -ljobs ## masscomp RTU6.0
  66.   #LIBES= -ltermcap -lauth        ## for Ultrix with Enhanced Security
  67.   
  68.   
  69.   # The difficult choice of a c-compiler...
  70. --- 141,147 ----
  71.   #LIBES= -lcurses -lnsl -lsocket -lc /usr/ucblib/libucb.a ## Stardent Vistra
  72.   #LIBES= -ltermcap -lndir -lsocket -ljobs ## masscomp RTU6.0
  73.   #LIBES= -ltermcap -lauth        ## for Ultrix with Enhanced Security
  74. ! LIBES= -lbtermcap        ## when compiling with -mbaserel in MiNT
  75.   
  76.   
  77.   # The difficult choice of a c-compiler...
  78. ***************
  79. *** 146,151 ****
  80. --- 151,157 ----
  81.   # If you want to take out -traditional, make sure that your sys/ioctl.h
  82.   # is fixed correctly, otherwise you'll be stopped for tty input, or you
  83.   # will lose the editor and job control.
  84. + #CC=     $(CROSSBIN)/cgcc -Wall
  85.   CC=    gcc -Wall 
  86.   #CC=    cc
  87.   #CC=    occ
  88. diff --context --new-file --recursive ../tcsh-6.02/config.h ./config.h
  89. *** ../tcsh-6.02/config.h
  90. --- ./config.h    Sun Feb 21 01:39:54 1993
  91. ***************
  92. *** 0 ****
  93. --- 1,114 ----
  94. + /*
  95. +  * config.h -- configure various defines for tcsh
  96. +  *
  97. +  * All source files should #include this FIRST.
  98. +  *
  99. +  * Edit this to match your system type.
  100. +  */
  101. + #ifndef __MINT__
  102. + #define __MINT__
  103. + #endif
  104. + /****************** System dependant compilation flags ****************/
  105. + /*
  106. +  * POSIX    This system supports IEEE Std 1003.1-1988 (POSIX).
  107. +  */
  108. + #undef POSIX
  109. + /*
  110. +  * POSIXJOBS    This system supports the optional IEEE Std 1003.1-1988 (POSIX)
  111. +  *        job control facilities.
  112. +  */
  113. + #undef POSIXJOBS
  114. + /*
  115. +  * VFORK    This machine has a vfork().  
  116. +  *        It used to be that for job control to work, this define
  117. +  *        was mandatory. This is not the case any more.
  118. +  *        If you think you still need it, but you don't have vfork, 
  119. +  *        define this anyway and then do #define vfork fork.  
  120. +  *        I do this anyway on a Sun because of yellow pages brain damage,
  121. +  *        [should not be needed under 4.1]
  122. +  *        and on the iris4d cause    SGI's fork is sufficiently "virtual" 
  123. +  *        that vfork isn't necessary.  (Besides, SGI's vfork is weird).
  124. +  *        Note that some machines eg. rs6000 have a vfork, but not
  125. +  *        with the berkeley semantics, so we cannot use it there either.
  126. +  */
  127. + #define VFORK
  128. + /*
  129. +  * BSDJOBS    You have BSD-style job control (both process groups and
  130. +  *        a tty that deals correctly
  131. +  */
  132. + #define BSDJOBS
  133. + /*
  134. +  * BSDSIGS    You have 4.2-style signals, rather than USG style.
  135. +  *        Note: POSIX systems should not define this unless they
  136. +  *        have sigvec() and friends (ie: 4.3BSD-RENO, HP-UX).
  137. +  */
  138. + #define BSDSIGS
  139. + /*
  140. +  * BSDTIMES    You have BSD-style process time stuff (like rusage)
  141. +  *        This may or may not be true.  For example, Apple Unix
  142. +  *        (OREO) has BSDJOBS and BSDSIGS but not BSDTIMES.
  143. +  */
  144. + #define BSDTIMES
  145. + /*
  146. +  * BSDNICE    Your system uses setpriority() instead of nice, to
  147. +  *        change a processes scheduling priority
  148. +  */
  149. + #undef BSDNICE
  150. + /*
  151. +  * TERMIO    You have struct termio instead of struct sgttyb.
  152. +  *         This is usually the case for SYSV systems, where
  153. +  *        BSD uses sgttyb. POSIX systems should define this
  154. +  *        anyway, even though they use struct termios.
  155. +  */
  156. + #undef TERMIO
  157. + /*
  158. +  * SYSVREL    Your machine is SYSV based (HPUX, A/UX)
  159. +  *        NOTE: don't do this if you are on a Pyramid -- tcsh is
  160. +  *        built in a BSD universe.
  161. +  *        Set SYSVREL to 1, 2, 3, or 4, depending the version of System V
  162. +  *        you are running. Or set it to 0 if you are not SYSV based
  163. +  */
  164. + #define SYSVREL    0
  165. + /*
  166. +  * YPBUGS    Work around Sun YP bugs that cause expansion of ~username
  167. +  *        to send command output to /dev/null
  168. +  */
  169. + #undef YPBUGS
  170. + /*
  171. +  * SIGVOID    Define this if your signal handlers return void.  On older
  172. +  *        systems, signal returns int, but on newer ones, it returns void.
  173. +  */
  174. + #define SIGVOID 
  175. + /*
  176. +  * HAVEDUP2    Define this if your system supports dup2().
  177. +  */
  178. + #define HAVEDUP2
  179. + /*
  180. +  * UTHOST    Does the utmp file have a host field?
  181. +  */
  182. + #define UTHOST
  183. + /*
  184. +  * DIRENT    Your system has <dirent.h> instead of <sys/dir.h>
  185. +  */
  186. + #define DIRENT
  187. + /****************** local defines *********************/
  188. + /****************** configurable hacks ****************/
  189. + /* have been moved to config_f.h */
  190. + #include "config_f.h"
  191. + #undef NLS
  192. diff --context --new-file --recursive ../tcsh-6.02/config_f.h ./config_f.h
  193. *** ../tcsh-6.02/config_f.h    Wed May 20 04:00:52 1992
  194. --- ./config_f.h    Sun Feb 21 01:39:46 1993
  195. ***************
  196. *** 95,101 ****
  197.    *        on the name of the tty, and environment.
  198.    *        Does not make sense in the modern window systems!
  199.    */
  200. ! #define AUTOLOGOUT
  201.   
  202.   /*
  203.    * SUSPENDED    Newer shells say 'Suspended' instead of 'Stopped'.
  204. --- 95,101 ----
  205.    *        on the name of the tty, and environment.
  206.    *        Does not make sense in the modern window systems!
  207.    */
  208. ! #undef AUTOLOGOUT
  209.   
  210.   /*
  211.    * SUSPENDED    Newer shells say 'Suspended' instead of 'Stopped'.
  212. ***************
  213. *** 117,122 ****
  214. --- 117,133 ----
  215.    */
  216.   #undef SYSMALLOC
  217.   
  218. + /*
  219. +  * DOSFS    Support DOS filessystems (which have a 12345678.123 limit),
  220. +  *        and allow backslashes as path separators
  221. +  */
  222. + #define DOSFS
  223. + /*
  224. +  * DOSTEXT    Support DOS text mode/files (ignore ^D)
  225. +  */
  226. + #define DOSTEXT
  227.   /*
  228.    * RCSID    This defines if we want rcs strings in the binary or not
  229.    *
  230. diff --context --new-file --recursive ../tcsh-6.02/ed.init.c ./ed.init.c
  231. *** ../tcsh-6.02/ed.init.c    Wed May 20 04:00:46 1992
  232. --- ./ed.init.c    Sun Feb 21 01:39:22 1993
  233. ***************
  234. *** 624,630 ****
  235. --- 624,648 ----
  236.       char    buf[BUFSIZE];
  237.   
  238.       chrs = read(SHIN, buf, (size_t) min(chrs, BUFSIZE - 1));
  239. + # ifdef DOSTEXT
  240. +     /* strip out carriage returns */
  241.       if (chrs > 0) {
  242. +         char *src, *dst;
  243. +         int i;
  244. +         src = dst = buf;
  245. +         for (i = chrs; i > 0; --i) {
  246. +             if (*src == '\r')
  247. +                 --chrs;
  248. +             else
  249. +                 *dst++ = *src;
  250. +             src++;
  251. +         }
  252. +     }
  253. + # endif
  254. +     if (chrs > 0) {
  255.           buf[chrs] = '\0';
  256.           Input_Line = Strsave(str2short(buf));
  257.           PushMacro(Input_Line);
  258. diff --context --new-file --recursive ../tcsh-6.02/ed.inputl.c ./ed.inputl.c
  259. *** ../tcsh-6.02/ed.inputl.c    Wed May 20 04:00:46 1992
  260. --- ./ed.inputl.c    Sun Feb 21 01:39:24 1993
  261. ***************
  262. *** 91,97 ****
  263. --- 91,102 ----
  264.       if (!Tty_raw_mode && MacroLvl < 0) {
  265.       long    chrs = 0;
  266.   
  267. + # ifndef __MINT__
  268. + /* MiNT _always_ wants to go into raw mode, so don't bother with the
  269. +  * FIONREAD test
  270. +  */
  271.       (void) ioctl(SHIN, FIONREAD, (ioctl_t) & chrs);
  272. + # endif
  273.       if (chrs == 0) {
  274.           if (Rawmode() < 0)
  275.           return 0;
  276. diff --context --new-file --recursive ../tcsh-6.02/pathnames.h ./pathnames.h
  277. *** ../tcsh-6.02/pathnames.h    Wed May 20 04:00:52 1992
  278. --- ./pathnames.h    Sun Feb 21 01:39:46 1993
  279. ***************
  280. *** 54,59 ****
  281. --- 54,65 ----
  282.   # define _PATH_DOTCSHRC        "/etc/cshrc"
  283.   #endif /* convex || __convex__ || stellar || INTEL */
  284.   
  285. + #ifdef DOSFS
  286. + # define _PATH_DOTLOGIN         "/etc/login.csh"
  287. + # define _PATH_DOTLOGOUT        "/etc/logout.csh"
  288. + # define _PATH_DOTCSHRC         "/etc/cshrc.csh"
  289. + #endif
  290.   #if defined(sgi) || defined(OREO) || defined(cray) || defined(AMIX)
  291.   # define _PATH_DOTLOGIN        "/etc/cshrc"
  292.   #endif /* sgi || OREO || cray || AMIX */
  293. diff --context --new-file --recursive ../tcsh-6.02/sh.c ./sh.c
  294. *** ../tcsh-6.02/sh.c    Wed May 20 04:00:38 1992
  295. --- ./sh.c    Sun Feb 21 01:38:50 1993
  296. ***************
  297. *** 124,129 ****
  298. --- 124,134 ----
  299.   static    void          mailchk    __P((void));
  300.   static    Char         **defaultpath    __P((void));
  301.   
  302. + #ifdef __MINT__
  303. + static    Char        **defaultsuffixes __P((void));
  304. + void    importsuffixes    __P((Char *));
  305. + #endif
  306.   int
  307.   main(argc, argv)
  308.       int     argc;
  309. ***************
  310. *** 216,221 ****
  311. --- 221,237 ----
  312.                      tempv[1][0] == '-' && tempv[1][1] == 'l' &&
  313.                           tempv[1][2] == '\0');
  314.   #endif
  315. + #ifdef __MINT__
  316. +     /* under MiNT, we're also a login shell if we ran from the desktop and
  317. +      * have no arguments
  318. +      */
  319. +     if (!loginsh && tempv[0][0] == 0 && !tempv[1]) {
  320. +         loginsh = 1;
  321. +         tempv[0] = "-tcsh";
  322. +     }
  323. + #endif
  324.       if (loginsh && **tempv != '-') {
  325.       /*
  326.        * Mangle the argv space
  327. ***************
  328. *** 502,507 ****
  329. --- 518,533 ----
  330.       else
  331.       importpath(SAVE(tcp));
  332.   
  333. + #ifdef __MINT__
  334. +     /*
  335. +      * set the suffix search list
  336. +      */
  337. +     if ((tcp = getenv("SUFFIXES")) == NULL)
  338. +         set1(STRsuffixes, defaultsuffixes(), &shvhed);
  339. +     else
  340. +         importsuffixes(SAVE(tcp));
  341. + #endif
  342.       set(STRshell, Strsave(STR_SHELLPATH));
  343.   
  344.       doldol = putn((int) getpid());    /* For $$ */
  345. ***************
  346. *** 708,713 ****
  347. --- 734,749 ----
  348.        */
  349.       if (nofile == 0 && argc > 0) {
  350.       nofile = open(tempv[0], O_RDONLY);
  351. + #ifdef __MINT__
  352. +     /* maybe the user tried to execute "foo.csh" as just "foo"
  353. +      */
  354. +     if (nofile < 0) {
  355. +             char *cshfile = alloca(strlen(tempv[0]) + 5);
  356. +             strcpy(cshfile, tempv[0]);
  357. +             strcat(cshfile, ".csh");
  358. +             nofile = open(cshfile, O_RDONLY);
  359. +     }
  360. + #endif
  361.       if (nofile < 0) {
  362.           child = 1;        /* So this ... */
  363.           /* ... doesn't return */
  364. ***************
  365. *** 1920,1925 ****
  366. --- 1956,1965 ----
  367.   #endif
  368.       int     i;
  369.   {
  370. + #ifdef __MINT__
  371. +     void rm_tmpfiles();
  372. +     rm_tmpfiles();            /* remove temporary files, see below */
  373. + #endif
  374.   #ifdef TESLA
  375.       if (loginsh && do_logout) {
  376.       /* this is to send hangup signal to the develcon */
  377. ***************
  378. *** 1986,1988 ****
  379. --- 2026,2165 ----
  380.       *blkp = NULL;
  381.       return (blk);
  382.   }
  383. + #ifdef __MINT__
  384. + /*
  385. +  * unlink() doesn't always work on an open file, so we try to arrange
  386. +  * to remove temporary files (e.g. for here documents) before exiting.
  387. +  */
  388. + struct tmpfile_rec {
  389. +     char *name;    /* the name of the temp. file */
  390. +     int pid;    /* the associated pid */
  391. +     struct tmpfile_rec *next;
  392. + } *root;
  393. + extern int __mint;
  394. + int
  395. + csh_tmpfile()
  396. + {
  397. +     extern char *tmpnam();
  398. +     struct tmpfile_rec *u;
  399. +     int fd;
  400. +     char *name;
  401. +     if ( !(name = tmpnam((char *)0)) )
  402. +         return -1;
  403. +     fd = open(name, O_CREAT|O_EXCL|O_RDWR, 0600);
  404. +     if (fd < 0) {
  405. +         free(name);
  406. +         return -1;
  407. +     }
  408. + /* in MiNT 0.9 and above, we can often unlink a file and continue to use
  409. +  * it; some file systems may return EACCDN for unlinking an open file,
  410. +  * in which case we use the old method of unlinking the file at exit
  411. +  */
  412. +     if (__mint >= 9) {
  413. +         if (unlink(name) == 0)
  414. +             return fd;
  415. +     }
  416. + /* if the unlink failed, save the name for future deleting */
  417. +     u = (struct tmpfile_rec *)malloc(sizeof(*u));
  418. +     if (!u) {
  419. + /* would it be better to fail? I dunno, but at worst the user is left
  420. +  * with a junk file in a temporary directory
  421. +  */
  422. +         return fd;
  423. +     }
  424. +     u->name = name;
  425. +     u->pid = getpid();
  426. +     u->next = root;
  427. +     root = u;
  428. +     return fd;
  429. + }
  430. + void
  431. + rm_tmpfiles()
  432. + {
  433. +     int pid = getpid();
  434. +     struct tmpfile_rec **old, *u;
  435. +     old = &root;
  436. +     u = root;
  437. +     while (u) {
  438. +         if (u->pid == pid) {
  439. +             (void) unlink(u->name);
  440. +             *old = u->next;
  441. +         } else {
  442. +             old = &u->next;
  443. +         }
  444. +         u = u->next;
  445. +     }
  446. + }
  447. + /* MiNT suffix stuff
  448. +  */
  449. + void
  450. + importsuffixes(cp)
  451. +     Char   *cp;
  452. + {
  453. +     register int i = 0;
  454. +     register Char *dp;
  455. +     register Char **pv;
  456. +     int     c;
  457. +     for (dp = cp; *dp; dp++)
  458. +     if (*dp == ',')
  459. +         i++;
  460. +     /*
  461. +      * i+2 where i is the number of ',' in the suffix list. There are i+1
  462. +      * suffixes plus we need room for a zero terminator.
  463. +      */
  464. +     pv = (Char **) xcalloc((size_t) (i + 2), sizeof(Char *));
  465. +     dp = cp;
  466. +     i = 0;
  467. +     if (*dp)
  468. +     for (;;) {
  469. +         if ((c = *dp) == ',' || c == 0) {
  470. +         *dp = 0;
  471. +         pv[i++] = Strsave(cp);
  472. +         if (c) {
  473. +             cp = dp + 1;
  474. +             *dp = ',';
  475. +         }
  476. +         else
  477. +             break;
  478. +         }
  479. +         dp++;
  480. +     }
  481. +     pv[i] = 0;
  482. +     set1(STRsuffixes, pv, &shvhed);
  483. + }
  484. + static Char **
  485. + defaultsuffixes()
  486. + {
  487. +     Char  **blk, **blkp;
  488. +     blkp = blk = (Char **) xmalloc((size_t) sizeof(Char *) * 9);
  489. +     *blkp++ = SAVE("ttp");
  490. +     *blkp++ = SAVE("prg");
  491. +     *blkp++ = SAVE("tos");
  492. +     *blkp++ = SAVE("app");
  493. +     *blkp++ = SAVE("gtp");
  494. +     *blkp++ = SAVE("csh");
  495. +     *blkp++ = SAVE("");
  496. +     *blkp = NULL;
  497. +     return (blk);
  498. + }
  499. + #endif /* __MINT__ */
  500. diff --context --new-file --recursive ../tcsh-6.02/sh.char.c ./sh.char.c
  501. *** ../tcsh-6.02/sh.char.c    Wed May 20 04:00:38 1992
  502. --- ./sh.char.c    Sun Feb 21 01:38:56 1993
  503. ***************
  504. *** 51,57 ****
  505. --- 51,62 ----
  506.       _CTR,        _CTR|_SP|_META,    _CTR|_NL|_META,    _CTR,
  507.   
  508.   /*     12 np         13 cr         14 so         15 si    */
  509. + #ifndef DOSTEXT
  510.       _CTR,        _CTR,        _CTR,        _CTR,
  511. + #else
  512. + /* cr is whitespace */
  513. +     _CTR,        _CTR|_SP|_META,    _CTR,        _CTR,
  514. + #endif
  515.   
  516.   /*     16 dle         17 dc1         18 dc2         19 dc3    */
  517.       _CTR,        _CTR,        _CTR,        _CTR,
  518. diff --context --new-file --recursive ../tcsh-6.02/sh.dir.c ./sh.dir.c
  519. *** ../tcsh-6.02/sh.dir.c    Wed May 20 04:00:38 1992
  520. --- ./sh.dir.c    Sun Feb 21 01:38:52 1993
  521. ***************
  522. *** 228,234 ****
  523.       len = Strlen(hp);
  524.       if (!(dirflag & DIR_LONG) && hp != NULL && !eq(hp, STRslash) &&
  525.           Strncmp(hp, dp->di_name, len) == 0 &&
  526. !         (dp->di_name[len] == '\0' || dp->di_name[len] == '/')) 
  527.           len = Strlen(s = (dp->di_name + len)) + 2;
  528.       else
  529.           len = Strlen(s = dp->di_name) + 1;
  530. --- 228,234 ----
  531.       len = Strlen(hp);
  532.       if (!(dirflag & DIR_LONG) && hp != NULL && !eq(hp, STRslash) &&
  533.           Strncmp(hp, dp->di_name, len) == 0 &&
  534. !         (dp->di_name[len] == '\0' || is_dirsep(dp->di_name[len]))) 
  535.           len = Strlen(s = (dp->di_name + len)) + 2;
  536.       else
  537.           len = Strlen(s = dp->di_name) + 1;
  538. ***************
  539. *** 295,301 ****
  540.   {
  541.   
  542.   /* return true if dp is of the form "../xxx" or "/../xxx" */
  543. ! #define HASDOTDOT(sp, p) (ISDOTDOT(p) && ((p) == (sp) || *((p) - 1) == '/'))
  544.   
  545.   #ifdef S_IFLNK
  546.       if (exp) {
  547. --- 295,301 ----
  548.   {
  549.   
  550.   /* return true if dp is of the form "../xxx" or "/../xxx" */
  551. ! #define HASDOTDOT(sp, p) (ISDOTDOT(p) && ((p) == (sp) || is_dirsep(*((p) - 1))))
  552.   
  553.   #ifdef S_IFLNK
  554.       if (exp) {
  555. ***************
  556. *** 325,331 ****
  557.        * If the path starts with a slash, we are not relative to
  558.        * the current working directory.
  559.        */
  560. !     if ( *start == '/' )
  561.           *cwd = '\0';
  562.   # ifdef apollo
  563.       slashslash = cwd[0] == '/' && cwd[1] == '/';
  564. --- 325,331 ----
  565.        * If the path starts with a slash, we are not relative to
  566.        * the current working directory.
  567.        */
  568. !     if ( is_abspath(start) )
  569.           *cwd = '\0';
  570.   # ifdef apollo
  571.       slashslash = cwd[0] == '/' && cwd[1] == '/';
  572. ***************
  573. *** 356,362 ****
  574.   
  575.           *dp = '\0';
  576.           while (dotdot > 0) 
  577. !             if ((dp = Strrchr(cwd, '/')) != NULL) {
  578.   # ifdef apollo
  579.               if (dp == &cwd[1]) 
  580.                   slashslash = 1;
  581. --- 356,362 ----
  582.   
  583.           *dp = '\0';
  584.           while (dotdot > 0) 
  585. !             if ((dp = Lastslash(cwd)) != NULL) {
  586.   # ifdef apollo
  587.               if (dp == &cwd[1]) 
  588.                   slashslash = 1;
  589. ***************
  590. *** 384,396 ****
  591.   # endif /* apollo */
  592.   
  593.           if (buf[0]) {
  594. !             if ((TRM(cwd[(dotdot = Strlen(cwd)) - 1])) != '/')
  595.               cwd[dotdot++] = '/';
  596.               cwd[dotdot] = '\0';
  597. !             dp = Strspl(cwd, TRM(buf[0]) == '/' ? &buf[1] : buf);
  598.               xfree((ptr_t) cwd);
  599.               cwd = dp;
  600. !             if ((TRM(cwd[(dotdot = Strlen(cwd)) - 1])) == '/')
  601.               cwd[--dotdot] = '\0';
  602.           }
  603.           if (!*cp)
  604. --- 384,396 ----
  605.   # endif /* apollo */
  606.   
  607.           if (buf[0]) {
  608. !             if (! is_dirsep(TRM(cwd[(dotdot = Strlen(cwd)) - 1])))
  609.               cwd[dotdot++] = '/';
  610.               cwd[dotdot] = '\0';
  611. !             dp = Strspl(cwd, is_dirsep(buf[0]) ? &buf[1] : buf);
  612.               xfree((ptr_t) cwd);
  613.               cwd = dp;
  614. !             if (is_dirsep(TRM(cwd[(dotdot = Strlen(cwd)) - 1])))
  615.               cwd[--dotdot] = '\0';
  616.           }
  617.           if (!*cp)
  618. ***************
  619. *** 463,469 ****
  620.   {
  621.       Char   *dp;
  622.   
  623. !     if (*cp != '/') {
  624.       register Char *p, *q;
  625.       int     cwdlen;
  626.   
  627. --- 463,469 ----
  628.   {
  629.       Char   *dp;
  630.   
  631. !     if (! is_abspath(cp)) {
  632.       register Char *p, *q;
  633.       int     cwdlen;
  634.   
  635. ***************
  636. *** 537,543 ****
  637.       serrno = errno;
  638.       }
  639.   
  640. !     if (cp[0] != '/' && !prefix(STRdotsl, cp) && !prefix(STRdotdotsl, cp)
  641.       && (c = adrof(STRcdpath))) {
  642.       Char  **cdp;
  643.       register Char *p;
  644. --- 537,543 ----
  645.       serrno = errno;
  646.       }
  647.   
  648. !     if ((! is_abspath(cp)) && !prefix(STRdotsl, cp) && !prefix(STRdotdotsl, cp)
  649.       && (c = adrof(STRcdpath))) {
  650.       Char  **cdp;
  651.       register Char *p;
  652. ***************
  653. *** 568,574 ****
  654.       }
  655.       }
  656.       dp = value(cp);
  657. !     if ((dp[0] == '/' || dp[0] == '.') && chdir(short2str(dp)) >= 0) {
  658.       xfree((ptr_t) cp);
  659.       cp = Strsave(dp);
  660.       printd = 1;
  661. --- 568,574 ----
  662.       }
  663.       }
  664.       dp = value(cp);
  665. !     if ((is_abspath(dp) || dp[0] == '.') && chdir(short2str(dp)) >= 0) {
  666.       xfree((ptr_t) cp);
  667.       cp = Strsave(dp);
  668.       printd = 1;
  669. ***************
  670. *** 796,806 ****
  671.        * christos: if the path given does not start with a slash prepend cwd. If
  672.        * cwd does not start with a slash or the result would be too long abort().
  673.        */
  674. !     if (*cp != '/') {
  675.       Char    tmpdir[MAXPATHLEN];
  676.   
  677.       p1 = value(STRcwd);
  678. !     if (p1 == NULL || *p1 != '/')
  679.           abort();
  680.       if (Strlen(p1) + Strlen(cp) + 1 >= MAXPATHLEN)
  681.           abort();
  682. --- 796,806 ----
  683.        * christos: if the path given does not start with a slash prepend cwd. If
  684.        * cwd does not start with a slash or the result would be too long abort().
  685.        */
  686. !     if (! is_abspath(cp)) {
  687.       Char    tmpdir[MAXPATHLEN];
  688.   
  689.       p1 = value(STRcwd);
  690. !     if (p1 == NULL || (! is_abspath(p1)))
  691.           abort();
  692.       if (Strlen(p1) + Strlen(cp) + 1 >= MAXPATHLEN)
  693.           abort();
  694. ***************
  695. *** 812,818 ****
  696.       }
  697.   
  698.   #ifdef COMMENT
  699. !     if (*cp != '/')
  700.       abort();
  701.   #endif /* COMMENT */
  702.   
  703. --- 812,818 ----
  704.       }
  705.   
  706.   #ifdef COMMENT
  707. !     if (! is_abspath(cp))
  708.       abort();
  709.   #endif /* COMMENT */
  710.   
  711. ***************
  712. *** 822,828 ****
  713.   
  714.       while (*p) {        /* for each component */
  715.       sp = p;            /* save slash address */
  716. !     while (*++p == '/')    /* flush extra slashes */
  717.           continue;
  718.       if (p != ++sp)
  719.           for (p1 = sp, p2 = p; (*p1++ = *p2++) != '\0';)
  720. --- 822,828 ----
  721.   
  722.       while (*p) {        /* for each component */
  723.       sp = p;            /* save slash address */
  724. !     while (is_dirsep(*++p))    /* flush extra slashes */
  725.           continue;
  726.       if (p != ++sp)
  727.           for (p1 = sp, p2 = p; (*p1++ = *p2++) != '\0';)
  728. ***************
  729. *** 830,836 ****
  730.       p = sp;            /* save start of component */
  731.       slash = 0;
  732.       while (*++p)        /* find next slash or end of path */
  733. !         if (*p == '/') {
  734.           slash = 1;
  735.           *p = 0;
  736.           break;
  737. --- 830,836 ----
  738.       p = sp;            /* save start of component */
  739.       slash = 0;
  740.       while (*++p)        /* find next slash or end of path */
  741. !         if (is_dirsep(*p)) {
  742.           slash = 1;
  743.           *p = 0;
  744.           break;
  745. ***************
  746. *** 880,891 ****
  747.            */
  748.           for (p1 = p; *p1++;)
  749.               continue;
  750. !         if (*link != '/') {
  751.               /*
  752.                * Relative path, expand it between the "yyy/" and the
  753.                * "/..". First, back sp up to the character past "yyy/".
  754.                */
  755. !             while (*--sp != '/')
  756.               continue;
  757.               sp++;
  758.               *sp = 0;
  759. --- 880,891 ----
  760.            */
  761.           for (p1 = p; *p1++;)
  762.               continue;
  763. !         if (! is_abspath(link)) {
  764.               /*
  765.                * Relative path, expand it between the "yyy/" and the
  766.                * "/..". First, back sp up to the character past "yyy/".
  767.                */
  768. !             while (! is_dirsep(*--sp))
  769.               continue;
  770.               sp++;
  771.               *sp = 0;
  772. ***************
  773. *** 934,940 ****
  774.   #endif                /* S_IFLNK */
  775.           *sp = '/';
  776.           if (sp != cp)
  777. !         while (*--sp != '/')
  778.               continue;
  779.           if (slash) {
  780.           for (p1 = sp + 1, p2 = p + 1; (*p1++ = *p2++) != '\0';)
  781. --- 934,940 ----
  782.   #endif                /* S_IFLNK */
  783.           *sp = '/';
  784.           if (sp != cp)
  785. !         while (! is_dirsep(*--sp))
  786.               continue;
  787.           if (slash) {
  788.           for (p1 = sp + 1, p2 = p + 1; (*p1++ = *p2++) != '\0';)
  789. ***************
  790. *** 971,983 ****
  791.            */
  792.           for (p1 = p; *p1++;)
  793.               continue;
  794. !         if (*link != '/') {
  795.               /*
  796.                * Relative path, expand it between the "yyy/" and the
  797.                * remainder. First, back sp up to the character past
  798.                * "yyy/".
  799.                */
  800. !             while (*--sp != '/')
  801.               continue;
  802.               sp++;
  803.               *sp = 0;
  804. --- 971,983 ----
  805.            */
  806.           for (p1 = p; *p1++;)
  807.               continue;
  808. !         if (! is_abspath(link)) {
  809.               /*
  810.                * Relative path, expand it between the "yyy/" and the
  811.                * remainder. First, back sp up to the character past
  812.                * "yyy/".
  813.                */
  814. !             while (! is_dirsep(*--sp))
  815.               continue;
  816.               sp++;
  817.               *sp = 0;
  818. ***************
  819. *** 1038,1045 ****
  820.       /*
  821.        * See if we're not in a subdir of STRhome
  822.        */
  823. !     if (p1 && *p1 == '/' &&
  824. !     (Strncmp(p1, cp, cc) != 0 || (cp[cc] != '/' && cp[cc] != '\0'))) {
  825.       static ino_t home_ino = (ino_t) -1;
  826.       static dev_t home_dev = -1;
  827.       static Char *home_ptr = NULL;
  828. --- 1038,1045 ----
  829.       /*
  830.        * See if we're not in a subdir of STRhome
  831.        */
  832. !     if (p1 && is_abspath(p1) &&
  833. !     (Strncmp(p1, cp, cc) != 0 || ((! is_dirsep(cp[cc])) && cp[cc] != '\0'))) {
  834.       static ino_t home_ino = (ino_t) -1;
  835.       static dev_t home_dev = -1;
  836.       static Char *home_ptr = NULL;
  837. ***************
  838. *** 1064,1070 ****
  839.               sp = (Char *) - 1;
  840.               break;
  841.           }
  842. !         if ((sp = Strrchr(p2, '/')) != NULL)
  843.           *sp = '\0';
  844.       }
  845.       /*
  846. --- 1064,1070 ----
  847.               sp = (Char *) - 1;
  848.               break;
  849.           }
  850. !         if ((sp = Lastslash(p2)) != NULL)
  851.           *sp = '\0';
  852.       }
  853.       /*
  854. diff --context --new-file --recursive ../tcsh-6.02/sh.dol.c ./sh.dol.c
  855. *** ../tcsh-6.02/sh.dol.c    Wed May 20 04:00:38 1992
  856. --- ./sh.dol.c    Sun Feb 21 01:38:52 1993
  857. ***************
  858. *** 444,449 ****
  859. --- 444,455 ----
  860.       if (dimen)
  861.           stderror(ERR_NOTALLOWED, "$?#");
  862.       for (np = wbuf; read(OLDSTD, &tnp, 1) == 1; np++) {
  863. + #ifdef DOSTEXT
  864. +         /* strip out cr's */
  865. +             while (tnp == '\r') {
  866. +                 if (read(OLDSTD, &tnp, 1) != 1) break;
  867. +             }
  868. + #endif
  869.           *np = (unsigned char) tnp;
  870.           if (np >= &wbuf[BUFSIZE - 1])
  871.           stderror(ERR_LTOOLONG);
  872. ***************
  873. *** 873,878 ****
  874. --- 879,895 ----
  875.       register Char *lbp, *obp, *mbp;
  876.       Char  **vp;
  877.       bool    quoted;
  878. + #ifdef __MINT__
  879. +     int tf;
  880. +     extern int csh_tmpfile __P((void));   /* in sh.c */
  881. +     tf = csh_tmpfile();
  882. +     if (tf < 0)
  883. +         stderror(ERR_SYSTEM, "tmpfile", strerror(errno));
  884. +     (void)dup2(tf, 0);
  885. +     (void)close(tf);
  886. + #else
  887.       char   *tmp;
  888.   
  889.       if (creat(tmp = short2str(shtemp), 0600) < 0)
  890. ***************
  891. *** 886,891 ****
  892. --- 903,910 ----
  893.       stderror(ERR_SYSTEM, tmp, strerror(errno));
  894.       }
  895.       (void) unlink(tmp);        /* 0 0 inode! */
  896. + #endif
  897.       Dv[0] = term;
  898.       Dv[1] = NULL;
  899.       gflag = 0;
  900. diff --context --new-file --recursive ../tcsh-6.02/sh.exec.c ./sh.exec.c
  901. *** ../tcsh-6.02/sh.exec.c    Wed May 20 04:00:38 1992
  902. --- ./sh.exec.c    Sun Feb 21 01:38:54 1993
  903. ***************
  904. *** 49,54 ****
  905. --- 49,60 ----
  906.   # define FASTHASH    /* Fast hashing is the default */
  907.   #endif /* OLDHASH */
  908.   
  909. + #ifdef __MINT__
  910. + extern char **environ;
  911. + int    csh_execve    __P((char *, char **, char **));
  912. + #define execv(f, t) csh_execve(f, t, environ)
  913. + #endif
  914.   /*
  915.    * System level search and execute of a command.
  916.    * We look in each directory for the specified command name.
  917. ***************
  918. *** 180,190 ****
  919.   #endif
  920.   
  921.       v = adrof(STRpath);
  922. !     if (v == 0 && expath[0] != '/') {
  923.       blkfree(pv);
  924.       pexerr();
  925.       }
  926. !     slash = any(short2str(expath), '/');
  927.   
  928.       /*
  929.        * Glob the argument list, if necessary. Otherwise trim off the quote bits.
  930. --- 186,196 ----
  931.   #endif
  932.   
  933.       v = adrof(STRpath);
  934. !     if (v == 0 && (! is_abspath(expath))) {
  935.       blkfree(pv);
  936.       pexerr();
  937.       }
  938. !     slash = hasslash(short2str(expath));
  939.   
  940.       /*
  941.        * Glob the argument list, if necessary. Otherwise trim off the quote bits.
  942. ***************
  943. *** 266,272 ****
  944.        * one at a time, as the user enters them.  This is kinda like Korn
  945.        * Shell's "tracked aliases".
  946.        */
  947. !     if (!slash && pv[0][0] == '/' && havhash) {
  948.   #ifdef FASTHASH
  949.           if (!bit(hashval, i))
  950.           goto cont;
  951. --- 272,278 ----
  952.        * one at a time, as the user enters them.  This is kinda like Korn
  953.        * Shell's "tracked aliases".
  954.        */
  955. !     if (!slash && is_abspath(pv[0]) && havhash) {
  956.   #ifdef FASTHASH
  957.           if (!bit(hashval, i))
  958.           goto cont;
  959. ***************
  960. *** 377,383 ****
  961. --- 383,393 ----
  962.        */
  963.       if ((fd = open(f, O_RDONLY)) != -1) {
  964.           if (read(fd, (char *) &c, 1) == 1) {
  965. + #ifndef DOSTEXT
  966.           if (!Isprint(c) && (c != '\n' && c != '\t')) {
  967. + #else
  968. +         if (!Isprint(c) && (c != '\n' && c != '\r' && c != '\t')) {
  969. + #endif
  970.               (void) close(fd);
  971.               /*
  972.                * We *know* what ENOEXEC means.
  973. ***************
  974. *** 404,410 ****
  975. --- 414,422 ----
  976.   #ifdef _PATH_BSHELL
  977.           if (fd != -1 
  978.   # ifndef ISC    /* Compatible with ISC's /bin/csh */
  979. + #  ifndef __MINT__ /* Compensate for missing #! interpretation */
  980.           && c != '#'
  981. + #  endif /* __MINT__ */
  982.   # endif /* ISC */
  983.           )
  984.           vp[0] = STR_BSHELL;
  985. ***************
  986. *** 580,585 ****
  987. --- 592,601 ----
  988.       struct varent *v = adrof(STRpath);
  989.       Char  **pv;
  990.       int hashval;
  991. + #ifdef __MINT__
  992. +     struct varent *suffv = adrof(STRsuffixes);
  993. +     Char **suffpv;
  994. + #endif
  995.   
  996.   #ifdef FASTHASH
  997.       if (vv && vv[1]) {
  998. ***************
  999. *** 620,626 ****
  1000.       if (v == NULL)
  1001.       return;
  1002.       for (pv = v->vec; *pv; pv++, i++) {
  1003. !     if (pv[0][0] != '/')
  1004.           continue;
  1005.       dirp = opendir(short2str(*pv));
  1006.       if (dirp == NULL)
  1007. --- 636,642 ----
  1008.       if (v == NULL)
  1009.       return;
  1010.       for (pv = v->vec; *pv; pv++, i++) {
  1011. !     if (! is_abspath(pv[0]))
  1012.           continue;
  1013.       dirp = opendir(short2str(*pv));
  1014.       if (dirp == NULL)
  1015. ***************
  1016. *** 639,644 ****
  1017. --- 655,673 ----
  1018.           (dp->d_name[1] == '\0' ||
  1019.            (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
  1020.           continue;
  1021. + #ifdef __MINT__
  1022. +             {   char *s = rindex(dp->d_name, '.');
  1023. +                 if (s && suffv) {
  1024. +                     for (suffpv = suffv->vec; *suffpv; suffpv++) {
  1025. +                         if (!strcmp(s+1, short2str(*suffpv))) {
  1026. +                             *s = 0; break;
  1027. +                         }
  1028. +                     }
  1029. +                 }
  1030. +             }
  1031. + #endif /* __MINT__ */
  1032.   #ifdef FASTHASH
  1033.           hashval = hashname(str2short(dp->d_name));
  1034.           bis(hashval, i);
  1035. ***************
  1036. *** 712,718 ****
  1037.       register Char **pv;
  1038.       register Char *sav;
  1039.       register struct varent *v;
  1040. !     register bool slash = any(short2str(name), '/');
  1041.       register int hashval, i;
  1042.   
  1043.       v = adrof(STRpath);
  1044. --- 741,747 ----
  1045.       register Char **pv;
  1046.       register Char *sav;
  1047.       register struct varent *v;
  1048. !     register bool slash = hasslash(short2str(name));
  1049.       register int hashval, i;
  1050.   
  1051.       v = adrof(STRpath);
  1052. ***************
  1053. *** 724,730 ****
  1054.       hashval = havhash ? hashname(name) : 0;
  1055.       i = 0;
  1056.       do {
  1057. !     if (!slash && pv[0][0] == '/' && havhash) {
  1058.   #ifdef FASTHASH
  1059.           if (!bit(hashval, i))
  1060.           goto cont;
  1061. --- 753,759 ----
  1062.       hashval = havhash ? hashname(name) : 0;
  1063.       i = 0;
  1064.       do {
  1065. !     if (!slash && is_abspath(pv[0]) && havhash) {
  1066.   #ifdef FASTHASH
  1067.           if (!bit(hashval, i))
  1068.           goto cont;
  1069. ***************
  1070. *** 770,775 ****
  1071. --- 799,857 ----
  1072.    * if dir_ok is set and the pathname refers to a directory.
  1073.    * This is a bit kludgy, but in the name of optimization...
  1074.    */
  1075. + #ifdef __MINT__
  1076. + int
  1077. + executable(dir, name, dir_ok)
  1078. +     Char   *dir, *name;
  1079. +     bool    dir_ok;
  1080. + {
  1081. +     char *ext, *base;
  1082. +     int i;
  1083. +     struct stat stbuf;
  1084. +     Char    path[MAXPATHLEN + 1];
  1085. +     char   *strname;
  1086. +     struct varent *v;
  1087. +     Char **pv;
  1088. +     if (dir && *dir) {
  1089. +         copyn(path, dir, MAXPATHLEN);
  1090. +         catn(path, name, MAXPATHLEN);
  1091. +         strname = short2str(path);
  1092. +     }
  1093. +     else
  1094. +         strname = short2str(name);
  1095. +     ext = base = alloca(strlen(strname) + 5);
  1096. +     while (*strname)
  1097. +         *ext++ = *strname++;
  1098. +     *ext = 0;
  1099. +     if (stat(base, &stbuf) != -1 &&
  1100. +         ((dir_ok && S_ISDIR(stbuf.st_mode)) ||
  1101. +           (S_ISREG(stbuf.st_mode) &&
  1102. +           ((stbuf.st_mode & (S_IXOTH|S_IXGRP|S_IXUSR))))))
  1103. +                 return 1;
  1104. +     if (dir_ok) return 0;
  1105. +     v = adrof(STRsuffixes);
  1106. +     if (v == 0) return 0;
  1107. +     
  1108. +     *ext++ = '.';
  1109. +     for (pv = v->vec; *pv; pv++) {
  1110. +         strcpy(ext, short2str(*pv));
  1111. +         if (stat(base, &stbuf) != -1 &&
  1112. +             (S_ISREG(stbuf.st_mode) &&
  1113. +              ((stbuf.st_mode & (S_IXOTH|S_IXGRP|S_IXUSR)) ||
  1114. +               !strcmp(ext, "csh"))))
  1115. +                return 1;
  1116. +     }
  1117. +     return 0;
  1118. + }
  1119. + #else /* __MINT__ */
  1120.   int
  1121.   executable(dir, name, dir_ok)
  1122.       Char   *dir, *name;
  1123. ***************
  1124. *** 795,800 ****
  1125. --- 877,884 ----
  1126.             access(strname, X_OK) == 0)));
  1127.   }
  1128.   
  1129. + #endif /* __MINT__ */
  1130.   void
  1131.   tellmewhat(lex)
  1132.       struct wordent *lex;
  1133. ***************
  1134. *** 853,859 ****
  1135.       if ((i = iscommand(strip(sp->word))) != 0) {
  1136.       register Char **pv;
  1137.       register struct varent *v;
  1138. !     bool    slash = any(short2str(sp->word), '/');
  1139.   
  1140.       v = adrof(STRpath);
  1141.       if (v == 0 || v->vec[0] == 0 || slash)
  1142. --- 937,943 ----
  1143.       if ((i = iscommand(strip(sp->word))) != 0) {
  1144.       register Char **pv;
  1145.       register struct varent *v;
  1146. !     bool    slash = hasslash(short2str(sp->word));
  1147.   
  1148.       v = adrof(STRpath);
  1149.       if (v == 0 || v->vec[0] == 0 || slash)
  1150. ***************
  1151. *** 918,924 ****
  1152.       Char *sv;
  1153.       int hashval, i, ex, rval = 0;
  1154.   
  1155. !     if (prt && any(short2str(cmd), '/')) {
  1156.       xprintf("where: / in command makes no sense\n");
  1157.       return 0;
  1158.       }
  1159. --- 1002,1008 ----
  1160.       Char *sv;
  1161.       int hashval, i, ex, rval = 0;
  1162.   
  1163. !     if (prt && hasslash(short2str(cmd))) {
  1164.       xprintf("where: / in command makes no sense\n");
  1165.       return 0;
  1166.       }
  1167. ***************
  1168. *** 985,987 ****
  1169. --- 1069,1110 ----
  1170.       xfree((ptr_t) sv);
  1171.       return rval;
  1172.   }
  1173. + #ifdef __MINT__
  1174. + #include <process.h>
  1175. + int
  1176. + csh_execve(path, argv, envp)
  1177. +         char *path;
  1178. +         char **argv, **envp;
  1179. + {
  1180. +         int i;
  1181. +         char *newpath, *s;
  1182. +         Char **pv;
  1183. +         struct varent *v;
  1184. +         newpath = s = alloca(strlen(path) + 5);
  1185. +         while (*path) {
  1186. +                 *s++ = *path++;
  1187. +         }
  1188. +         *s = 0;
  1189. +         if (access(newpath, 0) == 0)
  1190. +                 return _spawnve(P_OVERLAY, newpath, argv, envp);
  1191. +         v = adrof(STRsuffixes);
  1192. +         if (v == 0)
  1193. +                 return -1;
  1194. +         *s++ = '.';
  1195. +         for (pv = v->vec; *pv; pv++) {
  1196. +                 strcpy(s, short2str(*pv));
  1197. +                 if (access(newpath, 0) == 0) {
  1198. +                         return _spawnve(P_OVERLAY, newpath, argv, envp);
  1199. +                 }
  1200. +         }
  1201. +         return -1;
  1202. + }
  1203. + #endif /* __MINT__ */
  1204. diff --context --new-file --recursive ../tcsh-6.02/sh.file.c ./sh.file.c
  1205. *** ../tcsh-6.02/sh.file.c    Wed May 20 04:00:38 1992
  1206. --- ./sh.file.c    Sun Feb 21 01:38:56 1993
  1207. ***************
  1208. *** 407,413 ****
  1209.       if (old[0] != '~')
  1210.       return (Strcpy(new, old));
  1211.   
  1212. !     for (p = person, o = &old[1]; *o && *o != '/'; *p++ = *o++);
  1213.       *p = '\0';
  1214.       if (person[0] == '\0')
  1215.       (void) Strcpy(new, value(STRhome));
  1216. --- 407,413 ----
  1217.       if (old[0] != '~')
  1218.       return (Strcpy(new, old));
  1219.   
  1220. !     for (p = person, o = &old[1]; *o && (! is_dirsep(*o)); *p++ = *o++);
  1221.       *p = '\0';
  1222.       if (person[0] == '\0')
  1223.       (void) Strcpy(new, value(STRhome));
  1224. ***************
  1225. *** 502,508 ****
  1226.   {
  1227.       register Char *p;
  1228.   
  1229. !     p = Strrchr(path, '/');
  1230.       if (p == NULL) {
  1231.       copyn(name, path, MAXNAMLEN);
  1232.       dir[0] = '\0';
  1233. --- 502,508 ----
  1234.   {
  1235.       register Char *p;
  1236.   
  1237. !     p = Lastslash(path);
  1238.       if (p == NULL) {
  1239.       copyn(name, path, MAXNAMLEN);
  1240.       dir[0] = '\0';
  1241. ***************
  1242. *** 582,588 ****
  1243.       if (items != NULL)
  1244.       FREE_ITEMS(items);
  1245.   
  1246. !     looking_for_lognames = (*word == '~') && (Strchr(word, '/') == NULL);
  1247.       if (looking_for_lognames) {
  1248.       (void) setpwent();
  1249.       copyn(name, &word[1], MAXNAMLEN);    /* name sans ~ */
  1250. --- 582,588 ----
  1251.       if (items != NULL)
  1252.       FREE_ITEMS(items);
  1253.   
  1254. !     looking_for_lognames = (*word == '~') && (! Hasslash(word));
  1255.       if (looking_for_lognames) {
  1256.       (void) setpwent();
  1257.       copyn(name, &word[1], MAXNAMLEN);    /* name sans ~ */
  1258. diff --context --new-file --recursive ../tcsh-6.02/sh.func.c ./sh.func.c
  1259. *** ../tcsh-6.02/sh.func.c    Wed May 20 04:00:38 1992
  1260. --- ./sh.func.c    Sun Feb 21 01:38:58 1993
  1261. ***************
  1262. *** 66,71 ****
  1263. --- 66,75 ----
  1264.   static    void    toend        __P((void));
  1265.   static    void    xecho        __P((int, Char **));
  1266.   
  1267. + #ifdef __MINT__
  1268. + extern    void    importsuffixes    __P((Char *));  /* in sh.c */
  1269. + #endif
  1270.   struct biltins *
  1271.   isbfunc(t)
  1272.       struct command *t;
  1273. ***************
  1274. *** 272,278 ****
  1275. --- 276,293 ----
  1276.       islogin();
  1277.       rechist();
  1278.       (void) signal(SIGTERM, parterm);
  1279. + #ifdef __MINT__
  1280. +     {
  1281. +         extern int csh_execve __P((char *, char **, char **)); /* in sh.exec.c */
  1282. +         extern char **environ;
  1283. +         char *args[3];
  1284. +         
  1285. +         args[0] = "login"; args[1] = short2str(v[1]); args[2] = NULL;
  1286. +         (void)csh_execve(_PATH_LOGIN, args, environ);
  1287. +     }
  1288. + #else
  1289.       (void) execl(_PATH_LOGIN, "login", short2str(v[1]), NULL);
  1290. + #endif
  1291.       untty();
  1292.       xexit(1);
  1293.   }
  1294. ***************
  1295. *** 1162,1167 ****
  1296. --- 1177,1188 ----
  1297.       importpath(lp);
  1298.       dohash(NULL, NULL);
  1299.       }
  1300. + #ifdef __MINT__
  1301. +     else if (eq(vp, STRSUFFIXES)) {
  1302. +         importsuffixes(lp);
  1303. +         dohash(NULL, NULL);
  1304. +     }
  1305. + #endif /* __MINT__ */
  1306.   #ifdef apollo
  1307.       else if (eq(vp, STRSYSTYPE))
  1308.       dohash(NULL, NULL);
  1309. ***************
  1310. *** 1256,1261 ****
  1311. --- 1277,1286 ----
  1312.           maxi = 1;
  1313.           if (eq(name, STRNOREBIND))
  1314.               NoNLSRebind = 0;
  1315. + #ifdef __MINT__
  1316. +                 else if (eq(name, STRSUFFIXES))
  1317. +                     dohash(NULL, NULL);
  1318. + #endif
  1319.   #ifdef apollo
  1320.           else if (eq(name, STRSYSTYPE))
  1321.               dohash(NULL, NULL);
  1322. diff --context --new-file --recursive ../tcsh-6.02/sh.glob.c ./sh.glob.c
  1323. *** ../tcsh-6.02/sh.glob.c    Wed May 20 04:00:40 1992
  1324. --- ./sh.glob.c    Sun Feb 21 01:38:58 1993
  1325. ***************
  1326. *** 97,103 ****
  1327.       *gstart++ = *s++;
  1328.       u = s;
  1329.       for (b = gstart, e = &gbuf[MAXPATHLEN - 1]; 
  1330. !      *s && *s != '/' && *s != ':' && b < e;
  1331.        *b++ = *s++)
  1332.       continue;
  1333.       *b = EOS;
  1334. --- 97,103 ----
  1335.       *gstart++ = *s++;
  1336.       u = s;
  1337.       for (b = gstart, e = &gbuf[MAXPATHLEN - 1]; 
  1338. !      *s && (! is_dirsep(*s)) && *s != ':' && b < e;
  1339.        *b++ = *s++)
  1340.       continue;
  1341.       *b = EOS;
  1342. ***************
  1343. *** 135,141 ****
  1344.        * kfk - 17 Jan 1984 - stack hack allows user to get at arbitrary dir names
  1345.        * in stack. PWP: let =foobar pass through (for X windows)
  1346.        */
  1347. !     if (old[1] == '-' && (old[2] == '\0' || old[2] == '/')) {
  1348.       /* =- */
  1349.       dig = -1;
  1350.       b = &old[2];
  1351. --- 135,141 ----
  1352.        * kfk - 17 Jan 1984 - stack hack allows user to get at arbitrary dir names
  1353.        * in stack. PWP: let =foobar pass through (for X windows)
  1354.        */
  1355. !     if (old[1] == '-' && (old[2] == '\0' || is_dirsep(old[2]))) {
  1356.       /* =- */
  1357.       dig = -1;
  1358.       b = &old[2];
  1359. ***************
  1360. *** 145,151 ****
  1361.       dig = old[1] - '0';
  1362.       for (b = &old[2]; Isdigit(*b); b++)
  1363.           dig = dig * 10 + (*b - '0');
  1364. !     if (*b != '\0' && *b != '/')
  1365.           /* =<number>foobar */
  1366.           return old;
  1367.       }
  1368. --- 145,151 ----
  1369.       dig = old[1] - '0';
  1370.       for (b = &old[2]; Isdigit(*b); b++)
  1371.           dig = dig * 10 + (*b - '0');
  1372. !     if (*b != '\0' && (! is_dirsep(*b)))
  1373.           /* =<number>foobar */
  1374.           return old;
  1375.       }
  1376. ***************
  1377. *** 665,671 ****
  1378.           else if (isglob(*c))
  1379.           gflag |= G_GLOB;
  1380.           else if (symlinks == SYM_EXPAND && 
  1381. !         *p && ISDOTDOT(c) && (c == *(t-1) || *(c-1) == '/') )
  1382.               gflag |= G_CSH;
  1383.       }
  1384.       }
  1385. --- 665,671 ----
  1386.           else if (isglob(*c))
  1387.           gflag |= G_GLOB;
  1388.           else if (symlinks == SYM_EXPAND && 
  1389. !         *p && ISDOTDOT(c) && (c == *(t-1) || is_dirsep(*(c-1))))
  1390.               gflag |= G_CSH;
  1391.       }
  1392.       }
  1393. ***************
  1394. *** 836,841 ****
  1395. --- 836,857 ----
  1396.           do
  1397.               icnt = read(pvec[0], tibuf, BUFSIZE);
  1398.           while (icnt == -1 && errno == EINTR);
  1399. + #ifdef DOSTEXT
  1400. +         /* strip out carriage returns */
  1401. +                 {
  1402. +                     char *src, *dst;
  1403. +                     int i;
  1404. +                     src = dst = tibuf;
  1405. +                     for (i = icnt; i > 0; --i) {
  1406. +                             if (*src == '\r')
  1407. +                                     --icnt;
  1408. +                             else
  1409. +                                     *dst++ = *src;
  1410. +                             src++;
  1411. +                     }
  1412. +                 }
  1413. + #endif
  1414.           if (icnt <= 0) {
  1415.               c = -1;
  1416.               break;
  1417. diff --context --new-file --recursive ../tcsh-6.02/sh.h ./sh.h
  1418. *** ../tcsh-6.02/sh.h    Wed May 20 04:00:42 1992
  1419. --- ./sh.h    Sun Feb 21 01:39:08 1993
  1420. ***************
  1421. *** 160,166 ****
  1422.   #ifdef _SEQUENT_
  1423.   # include <sys/procstats.h>
  1424.   #endif /* _SEQUENT_ */
  1425. ! #if defined(POSIX) || SYSVREL > 0
  1426.   # include <sys/times.h>
  1427.   #endif /* POSIX || SYSVREL > 0 */
  1428.   
  1429. --- 160,166 ----
  1430.   #ifdef _SEQUENT_
  1431.   # include <sys/procstats.h>
  1432.   #endif /* _SEQUENT_ */
  1433. ! #if defined(POSIX) || SYSVREL > 0 || defined(__MINT__)
  1434.   # include <sys/times.h>
  1435.   #endif /* POSIX || SYSVREL > 0 */
  1436.   
  1437. ***************
  1438. *** 173,178 ****
  1439. --- 173,182 ----
  1440.   #endif /* _MINIX */
  1441.   #include <sys/stat.h>
  1442.   
  1443. + #ifdef __MINT__
  1444. + #include <support.h>
  1445. + #endif
  1446.   #ifdef BSDTIMES
  1447.   # include <sys/time.h>
  1448.   # if SYSVREL>3
  1449. ***************
  1450. *** 202,208 ****
  1451.   #  define CSWTCH _POSIX_VDISABLE    /* So job control works */
  1452.   #endif /* DGUX */
  1453.   
  1454. ! #ifdef POSIX
  1455.   /*
  1456.    * We should be using setpgid and setpgid
  1457.    * by now, but in some systems we use the
  1458. --- 206,212 ----
  1459.   #  define CSWTCH _POSIX_VDISABLE    /* So job control works */
  1460.   #endif /* DGUX */
  1461.   
  1462. ! #if defined(POSIX) || defined(__MINT__)
  1463.   /*
  1464.    * We should be using setpgid and setpgid
  1465.    * by now, but in some systems we use the
  1466. ***************
  1467. *** 261,266 ****
  1468. --- 265,277 ----
  1469.   
  1470.   #include <errno.h>
  1471.   
  1472. + #ifdef __MINT__
  1473. + /* undef E_SEEK from errno.h */
  1474. + # undef E_SEEK
  1475. + # define ENOTDIR EPATH
  1476. + # define ESPIPE EINVAL
  1477. + #endif
  1478.   #include <setjmp.h>
  1479.   
  1480.   #if __STDC__
  1481. ***************
  1482. *** 318,323 ****
  1483. --- 329,349 ----
  1484.   # endif 
  1485.   #endif 
  1486.   
  1487. + #ifndef DOSFS
  1488. + # define is_dirsep(c)    ((c) == '/')
  1489. + # define is_abspath(p)    (is_dirsep(*(p)))
  1490. + # define lastslash(p)    (strrchr((p), '/'))
  1491. + # define Lastslash(p)    (Strrchr((p), '/'))
  1492. + # define hasslash(p)    (any((p), '/'))
  1493. + # define Hasslash(p)    (Strrchr((p), '/'))
  1494. + #else
  1495. + extern int    is_dirsep    __P((int));
  1496. + extern int    is_abspath    __P((Char *));
  1497. + extern char *    lastslash    __P((char *));
  1498. + extern Char *    Lastslash    __P((Char *));
  1499. + extern int    hasslash    __P((char *));
  1500. + extern int    Hasslash    __P((Char *));
  1501. + #endif
  1502.   
  1503.   typedef int bool;
  1504.   
  1505. diff --context --new-file --recursive ../tcsh-6.02/sh.lex.c ./sh.lex.c
  1506. *** ../tcsh-6.02/sh.lex.c    Wed May 20 04:00:40 1992
  1507. --- ./sh.lex.c    Sun Feb 21 01:39:02 1993
  1508. ***************
  1509. *** 387,393 ****
  1510.       for (;;) {
  1511.       if ((c = peekc) != 0) {
  1512.           peekc = 0;
  1513. !         return (c);
  1514.       }
  1515.       if (lap) {
  1516.           if ((c = *lap++) == 0)
  1517. --- 387,393 ----
  1518.       for (;;) {
  1519.       if ((c = peekc) != 0) {
  1520.           peekc = 0;
  1521. !             goto ret_c;
  1522.       }
  1523.       if (lap) {
  1524.           if ((c = *lap++) == 0)
  1525. ***************
  1526. *** 395,410 ****
  1527.           else {
  1528.           if (cmap(c, _META | _Q | _Q1))
  1529.               c |= QUOTE;
  1530. !         return (c);
  1531.           }
  1532.       }
  1533.       if ((c = peekd) != 0) {
  1534.           peekd = 0;
  1535. !         return (c);
  1536.       }
  1537.       if (exclp) {
  1538.           if ((c = *exclp++) != 0)
  1539. !         return (c);
  1540.           if (exclnxt && --exclc >= 0) {
  1541.           exclnxt = exclnxt->next;
  1542.           setexclp(exclnxt->word);
  1543. --- 395,410 ----
  1544.           else {
  1545.           if (cmap(c, _META | _Q | _Q1))
  1546.               c |= QUOTE;
  1547. !         goto ret_c;
  1548.           }
  1549.       }
  1550.       if ((c = peekd) != 0) {
  1551.           peekd = 0;
  1552. !         goto ret_c;
  1553.       }
  1554.       if (exclp) {
  1555.           if ((c = *exclp++) != 0)
  1556. !         goto ret_c;
  1557.           if (exclnxt && --exclc >= 0) {
  1558.           exclnxt = exclnxt->next;
  1559.           setexclp(exclnxt->word);
  1560. ***************
  1561. *** 433,438 ****
  1562. --- 433,445 ----
  1563.       break;
  1564.       }
  1565.       return (c);
  1566. + ret_c:
  1567. + #ifdef DOSTEXT
  1568. +     return (c == '\r' ? getC1(flag) : c);
  1569. + #else
  1570. +     return (c);
  1571. + #endif
  1572.   }
  1573.   
  1574.   static void
  1575. ***************
  1576. *** 1060,1069 ****
  1577.   
  1578.       case 'h':
  1579.       case 't':
  1580. !     if (!any(short2str(cp), '/'))
  1581.           return (type == 't' ? Strsave(cp) : 0);
  1582.       wp = Strend(cp);
  1583. !     while (*--wp != '/')
  1584.           continue;
  1585.       if (type == 'h')
  1586.           xp = Strsave(cp), xp[wp - cp] = 0;
  1587. --- 1067,1076 ----
  1588.   
  1589.       case 'h':
  1590.       case 't':
  1591. !     if (! hasslash(short2str(cp)))
  1592.           return (type == 't' ? Strsave(cp) : 0);
  1593.       wp = Strend(cp);
  1594. !     while (! is_dirsep(*--wp))
  1595.           continue;
  1596.       if (type == 'h')
  1597.           xp = Strsave(cp), xp[wp - cp] = 0;
  1598. ***************
  1599. *** 1074,1080 ****
  1600.       case 'e':
  1601.       case 'r':
  1602.       wp = Strend(cp);
  1603. !     for (wp--; wp >= cp && *wp != '/'; wp--)
  1604.           if (*wp == '.') {
  1605.           if (type == 'e')
  1606.               xp = Strsave(wp + 1);
  1607. --- 1081,1087 ----
  1608.       case 'e':
  1609.       case 'r':
  1610.       wp = Strend(cp);
  1611. !     for (wp--; wp >= cp && (! is_dirsep(*wp)); wp--)
  1612.           if (*wp == '.') {
  1613.           if (type == 'e')
  1614.               xp = Strsave(wp + 1);
  1615. ***************
  1616. *** 1554,1560 ****
  1617.       }
  1618.       c = fbuf[0][fseekp - fbobp];
  1619.       fseekp++;
  1620. !     return (c);
  1621.       }
  1622.   again:
  1623.       buf = (int) fseekp / BUFSIZE;
  1624. --- 1561,1567 ----
  1625.       }
  1626.       c = fbuf[0][fseekp - fbobp];
  1627.       fseekp++;
  1628. !     goto ret_c;
  1629.       }
  1630.   again:
  1631.       buf = (int) fseekp / BUFSIZE;
  1632. ***************
  1633. *** 1646,1652 ****
  1634. --- 1653,1665 ----
  1635.       }
  1636.       c = fbuf[buf][(int) fseekp % BUFSIZE];
  1637.       fseekp++;
  1638. + ret_c:
  1639. + #ifdef DOSTEXT
  1640. +     return (c == '\r' ? bgetc() : c);
  1641. + #else
  1642.       return (c);
  1643. + #endif
  1644.   }
  1645.   
  1646.   static void
  1647. diff --context --new-file --recursive ../tcsh-6.02/sh.misc.c ./sh.misc.c
  1648. *** ../tcsh-6.02/sh.misc.c    Wed May 20 04:00:40 1992
  1649. --- ./sh.misc.c    Sun Feb 21 01:39:02 1993
  1650. ***************
  1651. *** 38,43 ****
  1652. --- 38,47 ----
  1653.   
  1654.   RCSID("$Id: sh.misc.c,v 3.12 1992/03/27 01:59:46 christos Exp $")
  1655.   
  1656. + #ifdef __MINT__
  1657. + extern int __mint;      /* kernel version */
  1658. + #endif
  1659.   static    int    renum    __P((int, int));
  1660.   static  Char  **blkend    __P((Char **));
  1661.   static  Char  **blkcat    __P((Char **, Char **));
  1662. ***************
  1663. *** 266,271 ****
  1664. --- 270,281 ----
  1665.   {
  1666.       register int f;
  1667.   
  1668. + #ifdef __MINT__
  1669. + /* in TOS, all handles are shared by all processes! (ack!) */
  1670. +     if (__mint == 0)
  1671. +         return;
  1672. + #endif
  1673.       if (didcch)
  1674.       return;
  1675.       didcch = 1;
  1676. ***************
  1677. *** 304,309 ****
  1678. --- 314,322 ----
  1679.       if (i == j || i < 0)
  1680.       return (i);
  1681.   #ifdef HAVEDUP2
  1682. + # ifdef __MINT__
  1683. +     if (__mint != 0)    /* TOS screws up dup2 */
  1684. + # endif
  1685.       if (j >= 0) {
  1686.       (void) dup2(i, j);
  1687.       if (j != i)
  1688. ***************
  1689. *** 324,329 ****
  1690. --- 337,347 ----
  1691.   
  1692.       if (i == j || i < 0 || (j < 0 && i > 2))
  1693.       return (i);
  1694. + #ifdef __MINT__
  1695. +     if (__mint == 0 && j > 5) {
  1696. +         return (i <= 5) ? dup(i) : j;
  1697. +     }
  1698. + #endif
  1699.   #ifdef HAVEDUP2
  1700.       if (j >= 0) {
  1701.       (void) dup2(i, j);
  1702. ***************
  1703. *** 458,460 ****
  1704. --- 476,561 ----
  1705.           return (0);
  1706.       }
  1707.   }
  1708. + #ifdef DOSFS
  1709. + int
  1710. + is_dirsep(i)
  1711. +     int i;
  1712. + {
  1713. +     return i == '/' || i == '\\' ;
  1714. + }
  1715. + int
  1716. + is_abspath(pth)
  1717. +     register Char *pth;
  1718. + {
  1719. +     return is_dirsep(TRM(*pth)) || TRM(pth[1]) == ':';
  1720. + }
  1721. + char *
  1722. + lastslash(pth)
  1723. +         register char *pth;
  1724. + {
  1725. +         register char *slash = 0, *s = pth, c;
  1726. +         if (! s) return 0;
  1727. +         while ( (c = *s++) != 0) {
  1728. +                 if (is_dirsep(c))
  1729. +                         slash = s - 1;
  1730. +         }
  1731. +         if (slash)
  1732. +                 return slash;
  1733. +         return (pth[1] == ':') ? pth : 0;
  1734. + }
  1735. + Char *
  1736. + Lastslash(pth)
  1737. +     register Char *pth;
  1738. + {
  1739. +         register Char *slash = 0, *s = pth, c;
  1740. +     if (! s) return 0;
  1741. +         while ( (c = *s++) != 0) {
  1742. +                 if (is_dirsep(c))
  1743. +                         slash = s - 1;
  1744. +         }
  1745. +     if (slash)
  1746. +         return slash;
  1747. +     return (pth[1] == ':') ? pth : 0;
  1748. + }
  1749. + int
  1750. + hasslash(pth)
  1751. +         register char *pth;
  1752. + {
  1753. +         register char c;
  1754. +         if (! pth) return 0;
  1755. +         while ( (c = *pth++) != 0)
  1756. +                 if (is_dirsep(c))
  1757. +                         return 1;
  1758. +         return 0;
  1759. + }
  1760. + int
  1761. + Hasslash(pth)
  1762. +     register Char *pth;
  1763. + {
  1764. +     register Char c;
  1765. +     if (! pth) return 0;
  1766. +     while ( (c = *pth++) != 0)
  1767. +         if (is_dirsep(c))
  1768. +             return 1;
  1769. +     return 0;
  1770. + }
  1771. + #endif /* DOSFS */
  1772. diff --context --new-file --recursive ../tcsh-6.02/sh.proc.c ./sh.proc.c
  1773. *** ../tcsh-6.02/sh.proc.c    Wed May 20 04:00:40 1992
  1774. --- ./sh.proc.c    Sun Feb 21 01:39:04 1993
  1775. ***************
  1776. *** 83,94 ****
  1777.                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};
  1778.   
  1779.   # else /* !sun && !hp9000 */
  1780. ! #  ifdef masscomp
  1781.   /*
  1782.    * Initialization of this structure under RTU 4.1A & RTU 5.0 is problematic
  1783.    * because the first two elements are unions of a time_t and a struct timeval.
  1784.    * So we'll just have to trust the loader to do the "right thing", DAS DEC-90.
  1785.    */
  1786.   static struct rusage zru;
  1787.   #  else    /* masscomp */
  1788.   static struct rusage zru = {{0L, 0L}, {0L, 0L}, 0, 0, 0, 0, 0, 0, 0, 
  1789. --- 83,97 ----
  1790.                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};
  1791.   
  1792.   # else /* !sun && !hp9000 */
  1793. ! #  if defined(masscomp) || defined(__MINT__)
  1794.   /*
  1795.    * Initialization of this structure under RTU 4.1A & RTU 5.0 is problematic
  1796.    * because the first two elements are unions of a time_t and a struct timeval.
  1797.    * So we'll just have to trust the loader to do the "right thing", DAS DEC-90.
  1798.    */
  1799. + /* MiNT is missing a lot of fields, so we also trust the loader (we can
  1800. +  * trust it) to avoid getting errors from the compiler
  1801. +  */
  1802.   static struct rusage zru;
  1803.   #  else    /* masscomp */
  1804.   static struct rusage zru = {{0L, 0L}, {0L, 0L}, 0, 0, 0, 0, 0, 0, 0, 
  1805. ***************
  1806. *** 120,125 ****
  1807. --- 123,146 ----
  1808.   static    void         okpcntl    __P((void));
  1809.   static  struct process  *pfind        __P((Char *));
  1810.   
  1811. + #ifdef __MINT__
  1812. + /*
  1813. +  * MiNT's fork() is a lot like vfork() in some respects; in particular,
  1814. +  * if we set job control signals to SIG_DFL after fork() and then
  1815. +  * get a signal, our parent will never be able to reclaim the address
  1816. +  * space and everything will hang :-(. Solution: rather than SIG_DFL,
  1817. +  * set the signals to a null signal handler; if we exec(), they will
  1818. +  * be set to SIG_DFL automatically, and before then the signals will
  1819. +  * effectively be ignored.
  1820. +  */
  1821. + void
  1822. + sig_tmp_ign(int sig)
  1823. + {
  1824. + /* do nothing, and rely on the magic of restartable system calls :-) */
  1825. + }
  1826. + #endif
  1827.   /*
  1828.    * pchild - called at interrupt level by the SIGCHLD signal
  1829.    *    indicating that at least one child has terminated or stopped
  1830. ***************
  1831. *** 1826,1835 ****
  1832. --- 1847,1863 ----
  1833.           (void) signal(SIGQUIT, ignint ? SIG_IGN : SIG_DFL);
  1834.   #ifdef BSDJOBS
  1835.           if (wanttty >= 0) {
  1836. + # ifdef __MINT__
  1837. + /* see comments for sig_tmp_ign above */
  1838. +                 (void) signal(SIGTSTP, sig_tmp_ign);
  1839. +                 (void) signal(SIGTTIN, sig_tmp_ign);
  1840. +                 (void) signal(SIGTTOU, sig_tmp_ign);
  1841. + # else
  1842.           /* make stoppable */
  1843.           (void) signal(SIGTSTP, SIG_DFL);
  1844.           (void) signal(SIGTTIN, SIG_DFL);
  1845.           (void) signal(SIGTTOU, SIG_DFL);
  1846. + # endif
  1847.           }
  1848.   #endif /* BSDJOBS */
  1849.           (void) signal(SIGTERM, parterm);
  1850. diff --context --new-file --recursive ../tcsh-6.02/sh.sem.c ./sh.sem.c
  1851. *** ../tcsh-6.02/sh.sem.c    Wed May 20 04:00:42 1992
  1852. --- ./sh.sem.c    Sun Feb 21 01:39:06 1993
  1853. ***************
  1854. *** 490,498 ****
  1855. --- 490,507 ----
  1856.               }
  1857.   # ifdef BSDJOBS
  1858.               if (_gv.wanttty >= 0) {
  1859. + #  ifdef __MINT__
  1860. + /* see sh.proc.c */
  1861. +                             extern void sig_tmp_ign();
  1862. +                             (void) signal(SIGTSTP, sig_tmp_ign);
  1863. +                             (void) signal(SIGTTIN, sig_tmp_ign);
  1864. +                             (void) signal(SIGTTOU, sig_tmp_ign);
  1865. + #  else
  1866.                   (void) signal(SIGTSTP, SIG_DFL);
  1867.                   (void) signal(SIGTTIN, SIG_DFL);
  1868.                   (void) signal(SIGTTOU, SIG_DFL);
  1869. + #  endif
  1870.               }
  1871.   # endif /* BSDJOBS */
  1872.   
  1873. ***************
  1874. *** 624,631 ****
  1875. --- 633,642 ----
  1876.       execute(t->t_dcdr, _gv.wanttty, pv, pipeout);
  1877.       t->t_dcar->t_dflg |= F_PIPEOUT |
  1878.           (t->t_dflg & (F_PIPEIN | F_AMPERSAND | F_STDERR | F_NOINTERRUPT));
  1879. + # ifndef __MINT__
  1880.       if (_gv.wanttty > 0)
  1881.           _gv.wanttty = 0;    /* got tty already */
  1882. + # endif
  1883.       execute(t->t_dcar, _gv.wanttty, pipein, pv);
  1884.   #else /* !BACKPIPE */
  1885.       t->t_dcar->t_dflg |= F_PIPEOUT |
  1886. ***************
  1887. *** 633,640 ****
  1888. --- 644,653 ----
  1889.       execute(t->t_dcar, _gv.wanttty, pipein, pv);
  1890.       t->t_dcdr->t_dflg |= F_PIPEIN | (t->t_dflg &
  1891.               (F_PIPEOUT | F_AMPERSAND | F_NOFORK | F_NOINTERRUPT));
  1892. + # ifndef __MINT__
  1893.       if (_gv.wanttty > 0)
  1894.           _gv.wanttty = 0;    /* got tty already */
  1895. + # endif
  1896.       execute(t->t_dcdr, _gv.wanttty, pv, pipeout);
  1897.   #endif /* BACKPIPE */
  1898.       break;
  1899. ***************
  1900. *** 803,820 ****
  1901. --- 816,847 ----
  1902.           (void) dmove(fd, 0);
  1903.       }
  1904.       else if (flags & F_PIPEIN) {
  1905. + #ifdef __MINT__
  1906. +             (void) dup2(pipein[0], 0);
  1907. + #else
  1908.           (void) close(0);
  1909.           (void) dup(pipein[0]);
  1910. + #endif
  1911.           (void) close(pipein[0]);
  1912.           (void) close(pipein[1]);
  1913.       }
  1914.       else if ((flags & F_NOINTERRUPT) && tpgrp == -1) {
  1915. + #ifdef __MINT__
  1916. +             int fd = open(_PATH_DEVNULL, O_RDONLY);
  1917. +             (void) dup2(fd, 0);
  1918. +             (void) close(fd);
  1919. + #else
  1920.           (void) close(0);
  1921.           (void) open(_PATH_DEVNULL, O_RDONLY);
  1922. + #endif
  1923.       }
  1924.       else {
  1925. + #ifdef __MINT__
  1926. +             (void) dup2(OLDSTD, 0);
  1927. + #else
  1928.           (void) close(0);
  1929.           (void) dup(OLDSTD);
  1930. + #endif
  1931.   #ifdef FIONCLEX
  1932.   # ifdef CLEX_DUPS
  1933.           /*
  1934. ***************
  1935. *** 863,875 ****
  1936. --- 890,910 ----
  1937.       is1atty = isatty(1);
  1938.       }
  1939.       else if (flags & F_PIPEOUT) {
  1940. + #ifdef __MINT__
  1941. +         (void) dup2(pipeout[1], 1);
  1942. + #else
  1943.       (void) close(1);
  1944.       (void) dup(pipeout[1]);
  1945. + #endif
  1946.       is1atty = 0;
  1947.       }
  1948.       else {
  1949. + #ifdef __MINT__
  1950. +         (void) dup2(SHOUT, 1);
  1951. + #else
  1952.       (void) close(1);
  1953.       (void) dup(SHOUT);
  1954. + #endif
  1955.       is1atty = isoutatty;
  1956.   #ifdef FIONCLEX
  1957.   # ifdef CLEX_DUPS
  1958. ***************
  1959. *** 880,890 ****
  1960. --- 915,933 ----
  1961.   
  1962.       (void) close(2);
  1963.       if (flags & F_STDERR) {
  1964. + #ifdef __MINT__
  1965. +         (void) dup2(1, 2);
  1966. + #else
  1967.       (void) dup(1);
  1968. + #endif
  1969.       is2atty = is1atty;
  1970.       }
  1971.       else {
  1972. + #ifdef __MINT__
  1973. +         (void) dup2(SHDIAG, 2);
  1974. + #else
  1975.       (void) dup(SHDIAG);
  1976. + #endif
  1977.       is2atty = isdiagatty;
  1978.   #ifdef FIONCLEX
  1979.   # ifdef CLEX_DUPS
  1980. diff --context --new-file --recursive ../tcsh-6.02/sh.set.c ./sh.set.c
  1981. *** ../tcsh-6.02/sh.set.c    Wed May 20 04:00:42 1992
  1982. --- ./sh.set.c    Sun Feb 21 01:39:06 1993
  1983. ***************
  1984. *** 53,58 ****
  1985. --- 53,61 ----
  1986.   static    struct varent    *madrof        __P((Char *, struct varent *));
  1987.   static    void         unsetv1    __P((struct varent *));
  1988.   static    void         exportpath    __P((Char **));
  1989. + #ifdef __MINT__
  1990. + static  void             exportsuffixes __P((Char **));
  1991. + #endif
  1992.   static    void         balance    __P((struct varent *, int, int));
  1993.   
  1994.   /*
  1995. ***************
  1996. *** 132,137 ****
  1997. --- 135,146 ----
  1998.           exportpath(adrof(STRpath)->vec);
  1999.           dohash(NULL, NULL);
  2000.       }
  2001. + #ifdef __MINT__
  2002. +         else if (eq(vp, STRsuffixes)) {
  2003. +             exportsuffixes(adrof(STRsuffixes)->vec);
  2004. +             dohash(NULL, NULL);
  2005. +         }
  2006. + #endif
  2007.       else if (eq(vp, STRhistchars)) {
  2008.           register Char *pn = value(vp);
  2009.   
  2010. ***************
  2011. *** 335,340 ****
  2012. --- 344,355 ----
  2013.           exportpath(adrof(STRpath)->vec);
  2014.           dohash(NULL, NULL);
  2015.       }
  2016. + #ifdef __MINT__
  2017. +         else if (eq(vp, STRsuffixes)) {
  2018. +             exportsuffixes(adrof(STRsuffixes)->vec);
  2019. +             dohash(NULL, NULL);
  2020. +         }
  2021. + #endif
  2022.       xfree((ptr_t) vp);
  2023.       if (c != '=')
  2024.           xfree((ptr_t) p);
  2025. ***************
  2026. *** 407,413 ****
  2027.       }
  2028.       else {
  2029.       num = 4;        /* confuse lint */
  2030. !     if (sizeof(int) == num && ((unsigned int) n) == 2147483648) {
  2031.           *putp++ = '2';
  2032.           n = 147483648;
  2033.       }
  2034. --- 422,428 ----
  2035.       }
  2036.       else {
  2037.       num = 4;        /* confuse lint */
  2038. !     if (sizeof(int) == num && ((unsigned int) n) == 2147483648U) {
  2039.           *putp++ = '2';
  2040.           n = 147483648;
  2041.       }
  2042. ***************
  2043. *** 717,722 ****
  2044. --- 732,761 ----
  2045.       Setenv(STRPATH, exppath);
  2046.   }
  2047.   
  2048. + #ifdef __MINT__
  2049. + static void
  2050. + exportsuffixes(val)
  2051. +     Char  **val;
  2052. + {
  2053. +     Char    expsuff[BUFSIZE];
  2054. +     static Char STRcomma[] = { ',' , '\0' };
  2055. +     expsuff[0] = 0;
  2056. +     if (val)
  2057. +         while (*val) {
  2058. +             if (Strlen(*val) + Strlen(expsuff) + 2 > BUFSIZE) {
  2059. +                 xprintf("Warning: ridiculously long SUFFIXES truncated\n");
  2060. +                 break;
  2061. +             }
  2062. +             (void) Strcat(expsuff, *val++);
  2063. +             if (*val == 0 || eq(*val, STRRparen))
  2064. +                 break;
  2065. +             (void) Strcat(expsuff, STRcomma);
  2066. +         }
  2067. +     Setenv(STRSUFFIXES, expsuff);
  2068. + }
  2069. + #endif /* __MINT__ */
  2070.   #ifndef lint
  2071.    /*
  2072.     * Lint thinks these have null effect
  2073. diff --context --new-file --recursive ../tcsh-6.02/sh.time.c ./sh.time.c
  2074. *** ../tcsh-6.02/sh.time.c    Wed May 20 04:00:42 1992
  2075. --- ./sh.time.c    Sun Feb 21 01:39:06 1993
  2076. ***************
  2077. *** 168,173 ****
  2078. --- 168,174 ----
  2079.   {
  2080.       tvadd(&ru->ru_utime, &ru2->ru_utime);
  2081.       tvadd(&ru->ru_stime, &ru2->ru_stime);
  2082. + #ifndef __MINT__
  2083.       if (ru2->ru_maxrss > ru->ru_maxrss)
  2084.       ru->ru_maxrss = ru2->ru_maxrss;
  2085.   
  2086. ***************
  2087. *** 184,189 ****
  2088. --- 185,191 ----
  2089.       ru->ru_nsignals += ru2->ru_nsignals;
  2090.       ru->ru_nvcsw += ru2->ru_nvcsw;
  2091.       ru->ru_nivcsw += ru2->ru_nivcsw;
  2092. + #endif
  2093.   }
  2094.   
  2095.   #else /* BSDTIMES */
  2096. ***************
  2097. *** 313,319 ****
  2098. --- 315,325 ----
  2099.       int     ms =
  2100.       (e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000;
  2101.   
  2102. + # ifdef __MINT__
  2103. +     cp = "%Uu %Ss %E %P";
  2104. + # else
  2105.       cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww";
  2106. + # endif
  2107.   #else
  2108.   # ifdef _SEQUENT_
  2109.       int     ms =
  2110. ***************
  2111. *** 404,410 ****
  2112.           xprintf("%ld.%01ld%%", i / 10, i % 10);    /* nn.n% */
  2113.           break;
  2114.   
  2115. ! #ifdef BSDTIMES
  2116.           case 'W':        /* number of swaps */
  2117.           i = r1->ru_nswap - r0->ru_nswap;
  2118.           xprintf("%ld", i);
  2119. --- 410,416 ----
  2120.           xprintf("%ld.%01ld%%", i / 10, i % 10);    /* nn.n% */
  2121.           break;
  2122.   
  2123. ! #if defined(BSDTIMES) && !defined(__MINT__)
  2124.           case 'W':        /* number of swaps */
  2125.           i = r1->ru_nswap - r0->ru_nswap;
  2126.           xprintf("%ld", i);
  2127. diff --context --new-file --recursive ../tcsh-6.02/sh.types.h ./sh.types.h
  2128. *** ../tcsh-6.02/sh.types.h    Wed May 20 04:00:50 1992
  2129. --- ./sh.types.h    Sun Feb 21 01:39:38 1993
  2130. ***************
  2131. *** 402,407 ****
  2132. --- 402,416 ----
  2133.   # endif /* __SIZE_T && !_SIZE_T */
  2134.   #endif /* convex || __convex__ */
  2135.   
  2136. + /*
  2137. +  * MiNT
  2138. +  */
  2139. + #ifdef __MINT__
  2140. + # define _SIGMASK_T
  2141. + typedef long sigmask_t;
  2142. + #endif
  2143.   /***
  2144.    *** Catch all for non POSIX and/or non ANSI systems.
  2145.    *** Systems up to spec *should* define these automatically
  2146. diff --context --new-file --recursive ../tcsh-6.02/tc.alloc.c ./tc.alloc.c
  2147. *** ../tcsh-6.02/tc.alloc.c    Wed May 20 04:00:48 1992
  2148. --- ./tc.alloc.c    Sun Feb 21 01:39:30 1993
  2149. ***************
  2150. *** 46,51 ****
  2151. --- 46,58 ----
  2152.   
  2153.   RCSID("$Id: tc.alloc.c,v 3.12 1992/05/02 23:39:58 christos Exp $")
  2154.   
  2155. + #ifdef __MINT__
  2156. + /* need large stack because we alloc from stack (cause tcsh assumes
  2157. +  * continuus memory which MiNT does not provide)
  2158. +  */
  2159. + long _stksize = -128*1024L;
  2160. + #endif
  2161.   static char   *memtop = NULL;        /* PWP: top of current memory */
  2162.   static char   *membot = NULL;        /* PWP: bottom of allocatable memory */
  2163.   
  2164. ***************
  2165. *** 240,249 ****
  2166. --- 247,259 ----
  2167.       memtop = (char *) op;
  2168.       if (membot == NULL)
  2169.       membot = memtop;
  2170. + #ifndef __MINT__
  2171.       if ((int) op & 0x3ff) {
  2172.       memtop = (char *) sbrk(1024 - ((int) op & 0x3ff));
  2173.       memtop += 1024 - ((int) op & 0x3ff);
  2174.       }
  2175. + #endif
  2176.   
  2177.       /* take 2k unless the block is bigger than that */
  2178.       rnu = (bucket <= 8) ? 11 : bucket + 3;
  2179. diff --context --new-file --recursive ../tcsh-6.02/tc.const.c ./tc.const.c
  2180. *** ../tcsh-6.02/tc.const.c    Wed May 20 04:00:48 1992
  2181. --- ./tc.const.c    Sun Feb 21 01:39:32 1993
  2182. ***************
  2183. *** 77,101 ****
  2184. --- 77,127 ----
  2185.   Char STRhistfile[]     = { 'h', 'i', 's', 't', 'f', 'i', 'l', 'e', '\0' };
  2186.   Char STRsource[]        = { 's', 'o', 'u', 'r', 'c', 'e', '\0' };
  2187.   Char STRmh[]            = { '-', 'h', '\0' };
  2188. + #ifndef DOSFS
  2189.   Char STRtildothist[]    = { '~', '/', '.', 'h', 'i', 's', 't', 'o', 'r', 
  2190.                       'y', '\0' };
  2191. + #else
  2192. + Char STRtildothist[]    = { '~', '/', 'h', 'i', 's', 't', 'o', 'r', 'y',
  2193. +                             '.', 'c', 's', 'h', '\0' };
  2194. + #endif
  2195.   
  2196.   #ifdef KANJI
  2197.   Char STRnokanji[]       = { 'n', 'o', 'k', 'a', 'n', 'j', 'i', '\0' };
  2198.   #endif
  2199.   
  2200.   #ifdef CSHDIRS
  2201. + # ifndef DOSFS
  2202.   Char STRdirfile[]     = { '~', '/', '.', 'c', 's', 'h', 'd', 'i', 'r',
  2203.                             's', '\0' };
  2204.   Char STRsldtdirs[]    = { '/', '.', 'c', 's', 'h', 'd', 'i', 'r', 's', '\0' };
  2205. + # else
  2206. + Char STRdirfile[]     = { '~', '/', 'c', 's', 'h', 'd', 'i', 'r', 's',
  2207. +                           '.', 'c', 's', 'h', '\0' };
  2208. + Char STRsldtdirs[]    = { '/', 'c', 's', 'h', 'd', 'i', 'r', 's', '.',
  2209. +                           'c', 's', 'h', '\0' };
  2210. + # endif
  2211.   Char STRsavedirs[]    = { 's', 'a', 'v', 'e', 'd', 'i', 'r', 's', '\0' };
  2212.   #endif
  2213.   
  2214.   Char STRargv[]          = { 'a', 'r', 'g', 'v', '\0' };
  2215.   Char STRsavehist[]      = { 's', 'a', 'v', 'e', 'h', 'i', 's', 't', '\0' };
  2216. + #ifndef DOSFS
  2217.   Char STRsldthist[]      = { '/', '.', 'h', 'i', 's', 't', 'o', 'r', 'y', '\0' };
  2218. + #else
  2219. + Char STRsldthist[]      = { '/', 'h', 'i', 's', 't', 'o', 'r', 'y', '.',
  2220. +                             'c', 's', 'h', '\0' };
  2221. + #endif
  2222.   Char STRnormal[]        = { 'n', 'o', 'r', 'm', 'a', 'l', '\0' };
  2223. + #ifndef DOSFS
  2224.   Char STRsldtlogout[]    = { '/', '.', 'l', 'o', 'g', 'o', 'u', 't', '\0' };
  2225. + #else
  2226. + Char STRsldtlogout[]    = { '/', 'l', 'o', 'g', 'o', 'u', 't', '.', 'c', 's',
  2227. +                             'h', '\0' };
  2228. + #endif
  2229.   Char STRjobs[]          = { 'j', 'o', 'b', 's', '\0' };
  2230.   Char STRsymhash[]       = { '#', ' ', '\0' };
  2231.   Char STRsymarrow[]      = { '>', ' ', '\0' };
  2232. ***************
  2233. *** 197,205 ****
  2234. --- 223,241 ----
  2235.   Char STRmail[]        = { 'm', 'a', 'i', 'l', '\0' };
  2236.   Char STRwatch[]        = { 'w', 'a', 't', 'c', 'h', '\0' };
  2237.   
  2238. + #ifndef DOSFS
  2239.   Char STRsldottcshrc[]    = { '/', '.', 't', 'c', 's', 'h', 'r', 'c', '\0' };
  2240.   Char STRsldotcshrc[]    = { '/', '.', 'c', 's', 'h', 'r', 'c', '\0' };
  2241.   Char STRsldotlogin[]    = { '/', '.', 'l', 'o', 'g', 'i', 'n', '\0' };
  2242. + #else
  2243. + Char STRsldottcshrc[]   = { '/', 't', 'c', 's', 'h', 'r', 'c', '.', 'c', 
  2244. +                             's', 'h', '\0' };
  2245. + Char STRsldotcshrc[]    = { '/', 'c', 's', 'h', 'r', 'c', '.', 'c', 's', 
  2246. +                             'h', '\0' };
  2247. + Char STRsldotlogin[]    = { '/', 'l', 'o', 'g', 'i', 'n', '.', 'c', 's',
  2248. +                             'h', '\0' };
  2249. + #endif
  2250.   Char STRignoreeof[]    = { 'i', 'g', 'n', 'o', 'r', 'e', 'e', 'o', 'f', '\0' };
  2251.   Char STRnoclobber[]    = { 'n', 'o', 'c', 'l', 'o', 'b', 'b', 'e', 'r', '\0' };
  2252.   Char STRhelpcommand[]    = { 'h', 'e', 'l', 'p', 'c', 'o', 'm', 'm', 'a', 'n', 
  2253. ***************
  2254. *** 270,272 ****
  2255. --- 306,313 ----
  2256.   Char STRsys53[] = { 's', 'y', 's', '5', '.', '3', '\0' };
  2257.   Char STRver[] = { 'v', 'e', 'r', '\0' };
  2258.   #endif /* apollo */
  2259. + #ifdef __MINT__
  2260. + Char STRsuffixes[] = { 's', 'u', 'f', 'f', 'i', 'x', 'e', 's', '\0' };
  2261. + Char STRSUFFIXES[] = { 'S', 'U', 'F', 'F', 'I', 'X', 'E', 'S', '\0' };
  2262. + #endif
  2263. diff --context --new-file --recursive ../tcsh-6.02/tc.func.c ./tc.func.c
  2264. *** ../tcsh-6.02/tc.func.c    Wed May 20 04:00:48 1992
  2265. --- ./tc.func.c    Sun Feb 21 01:39:34 1993
  2266. ***************
  2267. *** 277,283 ****
  2268.           tmp = dnormalize(v[k], symlinks == SYM_IGNORE || 
  2269.                      symlinks == SYM_EXPAND);
  2270.           dp = &tmp[Strlen(tmp) - 1];
  2271. !         if (*dp == '/' && dp != tmp)
  2272.   #ifdef apollo
  2273.           if (dp != &tmp[1])
  2274.   #endif /* apollo */
  2275. --- 277,283 ----
  2276.           tmp = dnormalize(v[k], symlinks == SYM_IGNORE || 
  2277.                      symlinks == SYM_EXPAND);
  2278.           dp = &tmp[Strlen(tmp) - 1];
  2279. !         if (is_dirsep(*dp) && dp != tmp)
  2280.   #ifdef apollo
  2281.           if (dp != &tmp[1])
  2282.   #endif /* apollo */
  2283. ***************
  2284. *** 304,310 ****
  2285. --- 304,314 ----
  2286.           xprintf("%s:\n", short2str(tmp));
  2287.           for (cp = tmp, dp = buf; *cp; *dp++ = (*cp++ | QUOTE))
  2288.               continue;
  2289. + #if 0
  2290.           if (dp[-1] != (Char) ('/' | QUOTE))
  2291. + #else
  2292. +         if (! ((dp[-1] & QUOTE) && is_dirsep(dp[-1] & ~QUOTE)))
  2293. + #endif
  2294.               *dp++ = '/';
  2295.           else 
  2296.               dp[-1] &= TRIM;
  2297. ***************
  2298. *** 423,436 ****
  2299.       int     epl, vpl;
  2300.   
  2301.       if ((ep = getenv("EDITOR")) != NULL) {    /* if we have a value */
  2302. !     if ((p = strrchr(ep, '/')) != NULL)     /* if it has a path */
  2303.           ep = p + 1;        /* then we want only the last part */
  2304.       }
  2305.       else 
  2306.       ep = "ed";
  2307.   
  2308.       if ((vp = getenv("VISUAL")) != NULL) {    /* if we have a value */
  2309. !     if ((p = strrchr(vp, '/')) != NULL)     /* and it has a path */
  2310.           vp = p + 1;        /* then we want only the last part */
  2311.       }
  2312.       else 
  2313. --- 427,440 ----
  2314.       int     epl, vpl;
  2315.   
  2316.       if ((ep = getenv("EDITOR")) != NULL) {    /* if we have a value */
  2317. !     if ((p = lastslash(ep)) != NULL)     /* if it has a path */
  2318.           ep = p + 1;        /* then we want only the last part */
  2319.       }
  2320.       else 
  2321.       ep = "ed";
  2322.   
  2323.       if ((vp = getenv("VISUAL")) != NULL) {    /* if we have a value */
  2324. !     if ((p = lastslash(vp)) != NULL)     /* and it has a path */
  2325.           vp = p + 1;        /* then we want only the last part */
  2326.       }
  2327.       else 
  2328. ***************
  2329. *** 450,456 ****
  2330.           continue;
  2331.           *cp = '\0';
  2332.           
  2333. !         if ((cp = strrchr(p, '/')) != NULL)    /* and it has a path */
  2334.           cp = cp + 1;        /* then we want only the last part */
  2335.           else
  2336.           cp = p;            /* else we get all of it */
  2337. --- 454,460 ----
  2338.           continue;
  2339.           *cp = '\0';
  2340.           
  2341. !         if ((cp = lastslash(p)) != NULL)    /* and it has a path */
  2342.           cp = cp + 1;        /* then we want only the last part */
  2343.           else
  2344.           cp = p;            /* else we get all of it */
  2345. ***************
  2346. *** 1393,1405 ****
  2347.       }
  2348.       if (((h = value(STRhome)) != NULL) &&
  2349.       (Strncmp(p = *hm, h, j = Strlen(h)) == 0) &&
  2350. !     (p[j] == '/' || p[j] == '\0')) {
  2351.       *hm = &p[j];
  2352.       return STRNULL;
  2353.       }
  2354.       for (i = 0; i < tlength; i++)
  2355.       if ((Strncmp(p = *hm, tcache[i].home, j = tcache[i].hlen) == 0) &&
  2356. !         (p[j] == '/' || p[j] == '\0')) {
  2357.           *hm = &p[j];
  2358.           return tcache[i].user;
  2359.       }
  2360. --- 1397,1409 ----
  2361.       }
  2362.       if (((h = value(STRhome)) != NULL) &&
  2363.       (Strncmp(p = *hm, h, j = Strlen(h)) == 0) &&
  2364. !     (is_dirsep(p[j]) || p[j] == '\0')) {
  2365.       *hm = &p[j];
  2366.       return STRNULL;
  2367.       }
  2368.       for (i = 0; i < tlength; i++)
  2369.       if ((Strncmp(p = *hm, tcache[i].home, j = tcache[i].hlen) == 0) &&
  2370. !         (is_dirsep(p[j]) || p[j] == '\0')) {
  2371.           *hm = &p[j];
  2372.           return tcache[i].user;
  2373.       }
  2374. ***************
  2375. *** 1459,1466 ****
  2376. --- 1463,1478 ----
  2377.   
  2378.               if ((n = read(fd, tbuf, BUFSIZE)) <= 0)
  2379.               goto eof;
  2380. + #ifdef DOSTEXT
  2381. +         /* we probably should strip the carriage returns, but
  2382. +          * changing them to blanks will work just as well for most cases
  2383. +          */
  2384. +                     for (i = 0; i < n; i++)
  2385. +                         buf[i] = (tbuf[i] == '\r') ? ' ' : tbuf[i];
  2386. + #else
  2387.               for (i = 0; i < n; i++)
  2388.               buf[i] = tbuf[i];
  2389. + #endif
  2390.               p = buf;
  2391.           }
  2392.           n--;
  2393. diff --context --new-file --recursive ../tcsh-6.02/tc.os.c ./tc.os.c
  2394. *** ../tcsh-6.02/tc.os.c    Wed May 20 04:00:50 1992
  2395. --- ./tc.os.c    Sun Feb 21 01:39:28 1993
  2396. ***************
  2397. *** 943,949 ****
  2398.       /* look if we found root yet */
  2399.       if (st_cur.st_ino == st_root.st_ino &&
  2400.           DEV_DEV_COMPARE(st_cur.st_dev, st_root.st_dev)) {
  2401. !         (void) strcpy(pathname, *pathptr != '/' ? "/" : pathptr);
  2402.           return (pathname);
  2403.       }
  2404.   
  2405. --- 943,949 ----
  2406.       /* look if we found root yet */
  2407.       if (st_cur.st_ino == st_root.st_ino &&
  2408.           DEV_DEV_COMPARE(st_cur.st_dev, st_root.st_dev)) {
  2409. !         (void) strcpy(pathname, (! is_dirsep(*pathptr)) ? "/" : pathptr);
  2410.           return (pathname);
  2411.       }
  2412.   
  2413. diff --context --new-file --recursive ../tcsh-6.02/tc.os.h ./tc.os.h
  2414. *** ../tcsh-6.02/tc.os.h    Wed May 20 04:00:50 1992
  2415. --- ./tc.os.h    Sun Feb 21 01:39:34 1993
  2416. ***************
  2417. *** 375,380 ****
  2418. --- 375,381 ----
  2419.   extern int atoi();
  2420.   extern char *ttyname();
  2421.   
  2422. + #ifndef __MINT__
  2423.   # ifndef hpux
  2424.   #  if __GNUC__ != 2
  2425.   extern int abort();
  2426. ***************
  2427. *** 386,391 ****
  2428. --- 387,393 ----
  2429.   extern void abort();
  2430.   extern void qsort();
  2431.   # endif
  2432. + #endif /* __MINT__ */
  2433.   extern void perror();
  2434.   
  2435.   #ifndef NEEDgethostname
  2436. diff --context --new-file --recursive ../tcsh-6.02/tc.prompt.c ./tc.prompt.c
  2437. *** ../tcsh-6.02/tc.prompt.c    Wed May 20 04:00:50 1992
  2438. --- ./tc.prompt.c    Sun Feb 21 01:39:36 1993
  2439. ***************
  2440. *** 257,263 ****
  2441.               else {
  2442.               if ((scp != 'C') && (q = value(STRhome)) &&
  2443.                   Strncmp(buff, q, (k = Strlen(q))) == 0 &&
  2444. !                 (buff[k] == '/' || buff[k] == '\0')) {
  2445.                   buff[--k] = '~';
  2446.                   q = &buff[k];
  2447.               }
  2448. --- 257,263 ----
  2449.               else {
  2450.               if ((scp != 'C') && (q = value(STRhome)) &&
  2451.                   Strncmp(buff, q, (k = Strlen(q))) == 0 &&
  2452. !                 (is_dirsep(buff[k]) || buff[k] == '\0')) {
  2453.                   buff[--k] = '~';
  2454.                   q = &buff[k];
  2455.               }
  2456. ***************
  2457. *** 266,277 ****
  2458.               for (z = q; *z; z++)
  2459.                   continue;    /* find the end */
  2460.               while (j-- > 0) {
  2461. !                 while ((z > q) && (*z != '/'))
  2462.                   z--;    /* back up */
  2463.                   if (j && z > q)
  2464.                   z--;
  2465.               }
  2466. !             if (*z == '/' && z != q)
  2467.                   z++;
  2468.               while (*z) {
  2469.                   *p++ = attributes | *z++;
  2470. --- 266,277 ----
  2471.               for (z = q; *z; z++)
  2472.                   continue;    /* find the end */
  2473.               while (j-- > 0) {
  2474. !                 while ((z > q) && (! is_dirsep(*z)))
  2475.                   z--;    /* back up */
  2476.                   if (j && z > q)
  2477.                   z--;
  2478.               }
  2479. !             if (is_dirsep(*z) && z != q)
  2480.                   z++;
  2481.               while (*z) {
  2482.                   *p++ = attributes | *z++;
  2483. diff --context --new-file --recursive ../tcsh-6.02/tc.sig.c ./tc.sig.c
  2484. *** ../tcsh-6.02/tc.sig.c    Wed May 20 04:00:50 1992
  2485. --- ./tc.sig.c    Sun Feb 21 01:39:36 1993
  2486. ***************
  2487. *** 416,418 ****
  2488. --- 416,439 ----
  2489.       Synch_Cnt++;
  2490.   }
  2491.   #endif /* SIGSYNCH */
  2492. + #ifdef __MINT__
  2493. + /* MiNT has most BSD signal things, but not sigvec; punt */
  2494. + void
  2495. + mysigvec(sig, new, old)
  2496. +         int sig;
  2497. +         sigvec_t *new, *old;
  2498. + {
  2499. +         void (*oldhandler)();
  2500. +         if (new) {
  2501. +                 oldhandler = signal(sig, new->sv_handler);
  2502. +         } else {
  2503. +                 oldhandler = signal(sig, SIG_IGN);
  2504. +                 signal(sig, oldhandler);
  2505. +         }
  2506. +         if (old)
  2507. +                 old->sv_handler = oldhandler;
  2508. + }
  2509. + #endif /* __MINT__ */
  2510. diff --context --new-file --recursive ../tcsh-6.02/tc.sig.h ./tc.sig.h
  2511. *** ../tcsh-6.02/tc.sig.h    Wed May 20 04:00:50 1992
  2512. --- ./tc.sig.h    Sun Feb 21 01:39:38 1993
  2513. ***************
  2514. *** 77,82 ****
  2515. --- 77,90 ----
  2516.   #  define NEEDsignal
  2517.   # endif    /* hpux */
  2518.   
  2519. + # ifdef __MINT__
  2520. + #  define HAVE_SIGVEC
  2521. + typedef struct sigvec {
  2522. +         sigret_t (*sv_handler)();
  2523. + } sigvec_t;
  2524. + extern void mysigvec __P((int, sigvec_t *, sigvec_t *));
  2525. + #endif /* __MINT__ */
  2526.   # ifndef HAVE_SIGVEC
  2527.   #  define mysigvec(a, b, c)    sigvec(a, b, c)
  2528.   typedef struct sigvec sigvec_t;
  2529. ***************
  2530. *** 120,129 ****
  2531. --- 128,139 ----
  2532.   /*
  2533.    * For 4.2bsd signals.
  2534.    */
  2535. + # ifndef __MINT__
  2536.   # ifdef sigmask
  2537.   #  undef sigmask
  2538.   # endif                /* sigmask */
  2539.   # define    sigmask(s)    (1 << ((s)-1))
  2540. + # endif /* __MINT__ */
  2541.   # ifdef _SEQUENT_
  2542.   #  define     sigpause(a)    bsd_sigpause(a)
  2543.   #  define     signal(a, b)    bsd_signal(a, b)
  2544. diff --context --new-file --recursive ../tcsh-6.02/tw.init.c ./tw.init.c
  2545. *** ../tcsh-6.02/tw.init.c    Wed May 20 04:00:44 1992
  2546. --- ./tw.init.c    Sun Feb 21 01:39:14 1993
  2547. ***************
  2548. *** 248,259 ****
  2549.       struct varent *v = adrof(STRpath);
  2550.       struct varent *recexec = adrof(STRrecognize_only_executables);
  2551.   
  2552.   
  2553.       if (v == NULL) /* if no path */
  2554.       return;
  2555.   
  2556.       for (pv = v->vec; *pv; pv++) {
  2557. !     if (pv[0][0] != '/') {
  2558.           tw_cmd_got |= TW_FL_REL;
  2559.           continue;
  2560.       }
  2561. --- 248,263 ----
  2562.       struct varent *v = adrof(STRpath);
  2563.       struct varent *recexec = adrof(STRrecognize_only_executables);
  2564.   
  2565. + #ifdef __MINT__
  2566. +     struct varent *suffv = adrof(STRsuffixes);
  2567. +     Char **suffpv;
  2568. + #endif
  2569.   
  2570.       if (v == NULL) /* if no path */
  2571.       return;
  2572.   
  2573.       for (pv = v->vec; *pv; pv++) {
  2574. !     if (! is_dirsep(pv[0][0])) {
  2575.           tw_cmd_got |= TW_FL_REL;
  2576.           continue;
  2577.       }
  2578. ***************
  2579. *** 268,273 ****
  2580. --- 272,291 ----
  2581.           name = str2short(dp->d_name);
  2582.           if (dp->d_ino == 0 || (recexec && !executable(dir, name, 0)))
  2583.           continue;
  2584. + #ifdef __MINT__
  2585. +             {   char *s = rindex(name, '.');
  2586. +                 if (s && suffv) {
  2587. +                     for (suffpv = suffv->vec; *suffpv; suffpv++) {
  2588. +                         if (!strcmp(s+1, short2str(*suffpv))) {
  2589. +                             *s = 0; break;
  2590. +                         }
  2591. +                     }
  2592. +                 }
  2593. +             }
  2594. + #endif /* __MINT__ */
  2595.           tw_cmd_add(name);
  2596.       }
  2597.       (void) closedir(dirp);
  2598. ***************
  2599. *** 421,427 ****
  2600.   
  2601.           CLRDIR(tw_cmd_state.dfd)
  2602.   
  2603. !     while (*tw_cmd_state.pathv && tw_cmd_state.pathv[0][0] == '/')
  2604.           tw_cmd_state.pathv++;
  2605.       if ((ptr = *tw_cmd_state.pathv) != 0) {
  2606.           /*
  2607. --- 439,445 ----
  2608.   
  2609.           CLRDIR(tw_cmd_state.dfd)
  2610.   
  2611. !     while (*tw_cmd_state.pathv && is_dirsep(tw_cmd_state.pathv[0][0]))
  2612.           tw_cmd_state.pathv++;
  2613.       if ((ptr = *tw_cmd_state.pathv) != 0) {
  2614.           /*
  2615. diff --context --new-file --recursive ../tcsh-6.02/tw.parse.c ./tw.parse.c
  2616. *** ../tcsh-6.02/tw.parse.c    Wed May 20 04:00:44 1992
  2617. --- ./tw.parse.c    Sun Feb 21 01:39:16 1993
  2618. ***************
  2619. *** 258,264 ****
  2620.   
  2621.       case RECOGNIZE:
  2622.       if (adrof(STRautocorrect)) {
  2623. !         if ((slshp = Strrchr(wordp, '/')) != NULL && slshp[1] != '\0') {
  2624.           SearchNoDirErr = 1;
  2625.           for (bptr = wordp; bptr < slshp; bptr++) {
  2626.               /*
  2627. --- 258,264 ----
  2628.   
  2629.       case RECOGNIZE:
  2630.       if (adrof(STRautocorrect)) {
  2631. !         if ((slshp = Lastslash(word)) != NULL && slshp[1] != '\0') {
  2632.           SearchNoDirErr = 1;
  2633.           for (bptr = wordp; bptr < slshp; bptr++) {
  2634.               /*
  2635. ***************
  2636. *** 341,347 ****
  2637.       items[0] = buffer;
  2638.       items[1] = NULL;
  2639.       ptr = items;
  2640. !     count = (looking == TW_COMMAND && Strchr(wordp, '/') == 0) ? 
  2641.           c_glob(&ptr) : 
  2642.           t_glob(&ptr, looking == TW_COMMAND);
  2643.       if (count > 0) {
  2644. --- 341,347 ----
  2645.       items[0] = buffer;
  2646.       items[1] = NULL;
  2647.       ptr = items;
  2648. !     count = (looking == TW_COMMAND && Hasslash(wordp) == 0) ? 
  2649.           c_glob(&ptr) : 
  2650.           t_glob(&ptr, looking == TW_COMMAND);
  2651.       if (count > 0) {
  2652. ***************
  2653. *** 1140,1146 ****
  2654.       break;
  2655.   
  2656.       case TW_COMMAND:
  2657. !     if (Strchr(word, '/')) {
  2658.           looking = TW_FILE;
  2659.           flags |= TW_EXEC_CHK;
  2660.           flags |= TW_DIR_OK;
  2661. --- 1140,1146 ----
  2662.       break;
  2663.   
  2664.       case TW_COMMAND:
  2665. !     if (Hasslash(word)) {
  2666.           looking = TW_FILE;
  2667.           flags |= TW_EXEC_CHK;
  2668.           flags |= TW_DIR_OK;
  2669. ***************
  2670. *** 1175,1186 ****
  2671.        */
  2672.       flags |= (gpat == 0) ? TW_IGN_OK : TW_PAT_OK;
  2673.   
  2674. !     if ((*word == '~') && (Strchr(word, '/') == NULL)) {
  2675.       looking = TW_LOGNAME;
  2676.       target = name;
  2677.       }
  2678.       else if ((target = Strrchr(name, '$')) != 0 && 
  2679. !          (Strchr(name, '/') == NULL)) {
  2680.       target++;
  2681.       looking = TW_VARIABLE;
  2682.       }
  2683. --- 1175,1186 ----
  2684.        */
  2685.       flags |= (gpat == 0) ? TW_IGN_OK : TW_PAT_OK;
  2686.   
  2687. !     if ((*word == '~') && (Hasslash(word) == NULL)) {
  2688.       looking = TW_LOGNAME;
  2689.       target = name;
  2690.       }
  2691.       else if ((target = Strrchr(name, '$')) != 0 && 
  2692. !          (Hasslash(name) == NULL)) {
  2693.       target++;
  2694.       looking = TW_VARIABLE;
  2695.       }
  2696. ***************
  2697. *** 1232,1242 ****
  2698.       if (isadirectory(exp_dir, name)) {
  2699.           if (exp_dir[0] != '\0' || name[0] != '\0') {
  2700.           catn(dir, name, MAXNAMLEN);
  2701. !         if (dir[Strlen(dir) - 1] != '/')
  2702.               catn(dir, STRslash, MAXNAMLEN);
  2703.           if ((nd = expand_dir(dir, exp_dir, &dir_fd, command)) != 0)
  2704.               return nd;
  2705. !         if (word[Strlen(word) - 1] != '/')
  2706.               catn(word, STRslash, MAXNAMLEN);
  2707.           name[0] = '\0';
  2708.           }
  2709. --- 1232,1242 ----
  2710.       if (isadirectory(exp_dir, name)) {
  2711.           if (exp_dir[0] != '\0' || name[0] != '\0') {
  2712.           catn(dir, name, MAXNAMLEN);
  2713. !         if (! is_dirsep(dir[Strlen(dir) - 1])))
  2714.               catn(dir, STRslash, MAXNAMLEN);
  2715.           if ((nd = expand_dir(dir, exp_dir, &dir_fd, command)) != 0)
  2716.               return nd;
  2717. !         if (! is_dirsep(word[Strlen(word) - 1]))
  2718.               catn(word, STRslash, MAXNAMLEN);
  2719.           name[0] = '\0';
  2720.           }
  2721. ***************
  2722. *** 1342,1348 ****
  2723.   {
  2724.       register Char *p;
  2725.   
  2726. !     p = Strrchr(path, '/');
  2727.       if (p == NULL) {
  2728.       copyn(name, path, MAXNAMLEN);
  2729.       dir[0] = '\0';
  2730. --- 1342,1348 ----
  2731.   {
  2732.       register Char *p;
  2733.   
  2734. !     p = Lastslash(path);
  2735.       if (p == NULL) {
  2736.       copyn(name, path, MAXNAMLEN);
  2737.       dir[0] = '\0';
  2738. ***************
  2739. *** 1417,1423 ****
  2740.   
  2741.       switch (old[0]) {
  2742.       case '~':
  2743. !     for (p = new, o = &old[1]; *o && *o != '/'; *p++ = *o++) 
  2744.           continue;
  2745.       *p = '\0';
  2746.       if (gethdir(new)) {
  2747. --- 1417,1423 ----
  2748.   
  2749.       switch (old[0]) {
  2750.       case '~':
  2751. !     for (p = new, o = &old[1]; *o && (! is_dirsep(*o)); *p++ = *o++) 
  2752.           continue;
  2753.       *p = '\0';
  2754.       if (gethdir(new)) {
  2755. ***************
  2756. *** 1485,1494 ****
  2757.            */
  2758.           for (p = edir; *p; p++)
  2759.           continue;
  2760. !         if (*--p == '/') {
  2761.           for (p = nd; *p; p++)
  2762.               continue;
  2763. !         if (*--p != '/')
  2764.               p = NULL;
  2765.           }
  2766.           for (d = edir, s = nd; (*d++ = *s++) != '\0';)
  2767. --- 1485,1494 ----
  2768.            */
  2769.           for (p = edir; *p; p++)
  2770.           continue;
  2771. !         if (is_dirsep(*--p)) {
  2772.           for (p = nd; *p; p++)
  2773.               continue;
  2774. !         if (! is_dirsep(*--p))
  2775.               p = NULL;
  2776.           }
  2777.           for (d = edir, s = nd; (*d++ = *s++) != '\0';)
  2778. diff --context --new-file --recursive ../tcsh-6.02/tw.spell.c ./tw.spell.c
  2779. *** ../tcsh-6.02/tw.spell.c    Wed May 20 04:00:44 1992
  2780. --- ./tw.spell.c    Sun Feb 21 01:39:16 1993
  2781. ***************
  2782. *** 53,60 ****
  2783.       bool    foundslash = 0;
  2784.       int     retval;
  2785.   
  2786.       for (;;) {
  2787. !     while (*old == '/') {    /* skip '/' */
  2788.           *new++ = *old++;
  2789.           foundslash = 1;
  2790.       }
  2791. --- 53,67 ----
  2792.       bool    foundslash = 0;
  2793.       int     retval;
  2794.   
  2795. + #ifdef DOSFS
  2796. +     /* skip drive specification, if any */
  2797. +     if (*old && old[1] == ':' && is_dirsep(old[2])) {
  2798. +         *new++ = *old++; *new++ = *old++;
  2799. +     }
  2800. + #endif
  2801.       for (;;) {
  2802. !     while (is_dirsep(*old)) {    /* skip '/' */
  2803.           *new++ = *old++;
  2804.           foundslash = 1;
  2805.       }
  2806. ***************
  2807. *** 73,79 ****
  2808.           if (p < guess + FILSIZ)
  2809.               *p++ = *cp;
  2810.       ws = p;
  2811. !     for (; *old != '/' && *old != '\0'; old++)/* add current file name */
  2812.           if (p < guess + FILSIZ)
  2813.           *p++ = *old;
  2814.       *p = '\0';        /* terminate it */
  2815. --- 80,86 ----
  2816.           if (p < guess + FILSIZ)
  2817.               *p++ = *cp;
  2818.       ws = p;
  2819. !     for (; (! is_dirsep(*old)) && *old != '\0'; old++)/* add current file name */
  2820.           if (p < guess + FILSIZ)
  2821.           *p++ = *old;
  2822.       *p = '\0';        /* terminate it */
  2823. ***************
  2824. *** 84,90 ****
  2825.        */
  2826.       /* (*should* say "looking for directory" whenever '/' is next...) */
  2827.       retval = t_search(guess, p, SPELL, FILSIZ,
  2828. !               looking_for_cmd && (foundslash || *old != '/') ?
  2829.                 TW_COMMAND : TW_ZERO, 1, STRNULL, 0);
  2830.       if (retval >= 4 || retval < 0)
  2831.           return -1;        /* hopeless */
  2832. --- 91,97 ----
  2833.        */
  2834.       /* (*should* say "looking for directory" whenever '/' is next...) */
  2835.       retval = t_search(guess, p, SPELL, FILSIZ,
  2836. !               looking_for_cmd && (foundslash || (! is_dirsep(*old))) ?
  2837.                 TW_COMMAND : TW_ZERO, 1, STRNULL, 0);
  2838.       if (retval >= 4 || retval < 0)
  2839.           return -1;        /* hopeless */
  2840.